В следующем примере я хотел бы изменить определенный набор строк как группу, in-place
. Первый вызов inplace_process, по-видимому, приводит к копированию передаваемого массива, тогда как второй вызов inplace_process изменяет непосредственно переменную x.Как сделать обработку на месте определенного набора строк массива numpy
Размер массива в моем фактическом прецеденте слишком велик, чтобы создать копию, и я вызываю код, который является внешним для моего проекта.
import numpy as np
def inplace_process(a, C, N):
a.shape = (C, N)
a[:, :] = float(C*N)
C = 4
N = 128
x = np.zeros((C, N))
# process a specific set of rows
inplace_process(x[(0, 1, 3), :], 3, N)
# independently process an inner row
inplace_process(x[2, :], 1, N)
print '-----------------------------------------------------'
print ' We want C*N and not zeros'
print x
Выходы:
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]
[ 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128. 128.
128. 128. 128. 128. 128. 128. 128. 128.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.]]
Что именно ваш вопрос? – cel
Я верю, что op спрашивает, почему первый пример копирует, где другой делает это по ссылке. Может быть, так как вы выбираете непрерывный набор строк, он возвращает копию? Выбор по не изменяемому индексу возвращает копию? – postelrich
Вопрос в том, как передать ссылку на определенный набор строк numpy на функцию для обработки или модификации на месте? – papahabla