虽然建议的副本是Python Ellipsis对象的作用? 我想在一般a中回答该问题,我认为在x循环中使用该问题需要添加信息。
[https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values]
Python中的常规赋值仅更改局部或全局变量字典中的引用,而不是就地修改现有变量。 这意味着简单地分配给x不会将值放置到数组的元素中,而是将x从作为数组元素的引用切换为对您分配的值的引用。 要实际修改数组的元素,应使用省略号对x进行索引。
该部分包括您的代码示例。
因此,以我的话来说,a会就地修改x; x[:] = ...将断开与x[...] =变量的链接,而不更改它。 就像x[...]一样,但是可以处理任何维度(包括0d)的数组。 在这种情况下,nditer不仅仅是一个数字,而是一个数组。
如果没有2689989711996912912641,则与此a迭代最接近的事情是:
In [667]: for i, x in np.ndenumerate(a):
...: print(i, x)
...: a[i] = 2 * x
...:
(0, 0) 0
(0, 1) 1
...
(1, 2) 5
In [668]: a
Out[668]:
array([[ 0, 2, 4],
[ 6, 8, 10]])
请注意,我必须直接索引和修改a。 我不能使用x。在此迭代中x[:] = ...是一个标量,因此不可变
In [669]: for i,x in np.ndenumerate(a):
...: x[...] = 2 * x
...
TypeError: 'numpy.int32' object does not support item assignment
但是在a中,x是一个0d数组,并且是可变的。
In [671]: for x in np.nditer(a, op_flags=['readwrite']):
...: print(x, type(x), x.shape)
...: x[...] = 2 * x
...:
0 ()
4 ()
...
并且因为它是0d,所以不能使用a而不是x
----> 3 x[:] = 2 * x
IndexError: too many indices for array
一个更简单的数组迭代也可能会提供洞察力:
In [675]: for x in a:
...: print(x, x.shape)
...: x[:] = 2 * x
...:
[ 0 8 16] (3,)
[24 32 40] (3,)
这会在a的行(第1个暗点)上进行迭代。x是一维数组,可以用x[:] = ...或x[...] =进行修改。
如果我在下一节中添加a标志,则x现在是一维数组,并且x[:] = ...将起作用。 但是x[...] =仍然有效并且更通用。 x[...]用于所有其他nditer示例。
In [677]: for x in np.nditer(a, op_flags=['readwrite'], flags=['external_loop']):
...: print(x, type(x), x.shape)
...: x[...] = 2 * x
[ 0 16 32 48 64 80] (6,)
比较这个简单的行迭代(在二维数组上):
In [675]: for x in a:
...: print(x, x.shape)
...: x[:] = 2 * x
...:
[ 0 8 16] (3,)
[24 32 40] (3,)
这会在a的行(第1个暗点)上进行迭代。x是一维数组,可以用x[:] = ...或cython进行修改。
从头到尾阅读并尝试使用此cython页面。 就其本身而言,nditer在python中不是很有用。它不会加速迭代-直到将代码移植到cython.np.ndindex才是使用2689989712013689689的少数几个未编译的numpy函数之一。