Зачем нужен многоточие [...] при изменении значений массива в numpy? - PullRequest
0 голосов
/ 02 сентября 2018
import numpy as np                
a = np.arange(0,60,5)            
a = a.reshape(3,4)                                    

for x in np.nditer(a, op_flags = ['readwrite']):          
   x[...] = 2*x              
print 'Modified array is:'              
print a

Почему в приведенном выше коде мы не можем просто написать x = 2 * x вместо x [...] = 2 * x?

1 Ответ

0 голосов
/ 02 сентября 2018

Независимо от того, какой объект мы перебирали или как этот объект был реализован, для x = 2*x было бы почти невозможно сделать что-нибудь полезное для этого объекта. x = 2*x - присвоение переменной x; даже если предыдущее содержимое переменной x было получено путем итерации по некоторому объекту, новое присвоение x не повлияет на объект, по которому мы выполняем итерацию.

В этом конкретном случае, итерируя по массиву NumPy с np.nditer(a, op_flags = ['readwrite']), каждая итерация цикла устанавливает x в нульмерный массив, который является доступным для записи представление ячейки a , x[...] = 2*x записывает содержимое нулевого массива, а не связывает переменную x. Поскольку массив является представлением ячейки a, это присваивание записывает в соответствующую ячейку a.

Это очень похоже на разницу между l = [] и l[:] = [] с обычными списками, где l[:] = [] очистит существующий список, а l = [] заменит список новым пустым списком без изменения оригинала. Однако списки не поддерживают представления или нульмерные списки.

...