在numpy中修改数组值时,省略号的需要是什么?

问题描述 投票:1回答:1
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?

python numpy numpy-ndarray
1个回答
2
投票

无论我们迭代什么样的对象或者如何实现该对象,x = 2*x几乎不可能对该对象做任何有用的事情。 x = 2*x是变量x的赋值;即使x变量的先前内容是通过迭代某个对象获得的,对x的新赋值也不会影响我们迭代的对象。

在这种特定情况下,使用np.nditer(a, op_flags = ['readwrite'])迭代NumPy数组,循环的每次迭代都将x设置为零维数组,该数组是a单元格的可写视图。 x[...] = 2*x写入零维数组的内容,而不是重新绑定x变量。由于该数组是a单元格的视图,因此该赋值将写入a的相应单元格。

这与l = []l[:] = []与普通列表之间的区别非常相似,其中l[:] = []将清除现有列表,l = []将用新的空列表替换列表而不修改原始列表。但是,列表不支持视图或零维列表。

© www.soinside.com 2019 - 2024. All rights reserved.