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?
答案 0 :(得分:2)
无论我们要迭代哪种对象或如何实现该对象,x = 2*x
几乎都不可能对该对象执行任何有用的操作。 x = 2*x
是对变量x
的赋值;即使x
变量的先前内容是通过迭代某个对象获得的,对x
的新赋值也不会影响我们正在迭代的对象。
在这种特定情况下,使用np.nditer(a, op_flags = ['readwrite'])
遍历NumPy数组,循环的每次迭代都将x
设置为零维数组,该数组是a的可写 view a
的单元格。 x[...] = 2*x
写入零维数组的内容,而不是重新绑定x
变量。由于该数组是a
单元格的视图,因此此分配将写入a
的相应单元格。
这与l = []
和l[:] = []
与普通列表的区别非常相似,其中l[:] = []
将清除现有列表,而l = []
将列表替换为新列表,不修改原始清单的空白清单。不过,列表不支持视图或零维列表。