在 numpy 中修改数组值时省略号 [...] 的需要是什么?
What is the need of ellipsis[...] while modifying array values in numpy?
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?
无论我们迭代的是什么类型的对象,或者该对象是如何实现的,x = 2*x
几乎不可能对那个对象做任何有用的事情。 x = 2*x
是对变量x
的赋值;即使 x
变量的先前内容是通过迭代某个对象获得的,对 x
的新赋值也不会影响我们正在迭代的对象。
在这种特定情况下,使用 np.nditer(a, op_flags = ['readwrite'])
遍历 NumPy 数组,循环的每次迭代都会将 x
设置为可写的零维数组 view[= a
的一个单元格的 33=]。 x[...] = 2*x
写入零维数组的内容,而不是重新绑定 x
变量。由于数组是 a
单元格的视图,因此此赋值写入 a
.
的相应单元格
这与l = []
和l[:] = []
与普通列表的区别非常相似,其中l[:] = []
将清除现有列表而l = []
将列表替换为一个新的空列表而不修改原始列表。不过,列表不支持视图或零维列表。
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?
无论我们迭代的是什么类型的对象,或者该对象是如何实现的,x = 2*x
几乎不可能对那个对象做任何有用的事情。 x = 2*x
是对变量x
的赋值;即使 x
变量的先前内容是通过迭代某个对象获得的,对 x
的新赋值也不会影响我们正在迭代的对象。
在这种特定情况下,使用 np.nditer(a, op_flags = ['readwrite'])
遍历 NumPy 数组,循环的每次迭代都会将 x
设置为可写的零维数组 view[= a
的一个单元格的 33=]。 x[...] = 2*x
写入零维数组的内容,而不是重新绑定 x
变量。由于数组是 a
单元格的视图,因此此赋值写入 a
.
这与l = []
和l[:] = []
与普通列表的区别非常相似,其中l[:] = []
将清除现有列表而l = []
将列表替换为一个新的空列表而不修改原始列表。不过,列表不支持视图或零维列表。