以下是什么意思x[...]
?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
以下是什么意思x[...]
?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
Answers:
虽然建议的副本是Python Ellipsis对象的功能?在一般python
情况下回答问题nditer
,我认为在循环中使用它需要添加信息。
https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
Python中的常规赋值仅更改局部或全局变量字典中的引用,而不是就地修改现有变量。这意味着简单地分配给x不会将值放置到数组的元素中,而是将x从作为数组元素的引用切换为对您分配的值的引用。要实际修改数组的元素,应使用省略号对x进行索引。
该部分包括您的代码示例。
用我的话来说,就地x[...] = ...
修改x
; x = ...
会破坏该nditer
变量的链接,并且不会更改它。就像,x[:] = ...
但是可以使用任何维度的数组(包括0d)。在这种情况下x
,不仅仅是一个数字,而是一个数组。
也许与此nditer
迭代最接近的事情nditer
是:
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[i]
直接索引和修改。我不能用x = 2*x
。在此迭代x
中为标量,因此不可变
In [669]: for i,x in np.ndenumerate(a):
...: x[...] = 2 * x
...
TypeError: 'numpy.int32' object does not support item assignment
但是在这种nditer
情况下x
是一个0d数组,并且是可变的。
In [671]: for x in np.nditer(a, op_flags=['readwrite']):
...: print(x, type(x), x.shape)
...: x[...] = 2 * x
...:
0 <class 'numpy.ndarray'> ()
4 <class 'numpy.ndarray'> ()
...
并且因为它是0d,x[:]
所以不能代替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,)
这会在的行(第1个暗区)上进行迭代a
。 x
是一维数组,可以用x[:]=...
或修改x[...]=...
。
如果我external_loop
从下一部分添加标志,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] <class 'numpy.ndarray'> (6,)
比较这个简单的行迭代(在二维数组上):
In [675]: for x in a:
...: print(x, x.shape)
...: x[:] = 2 * x
...:
[ 0 8 16] (3,)
[24 32 40] (3,)
这会在的行(第1个暗区)上进行迭代a
。 x
是一维数组,可以用x[:] = ...
或修改x[...] = ...
。
从头到尾阅读并尝试使用此nditer
页面。就其本身而言,nditer
在中不是那么有用python
。它不会加快迭代速度-除非将代码移植到cython
。np.ndindex
是使用的少数几个未编译numpy
函数之一nditer
。