索引数字时,Python中的“三个点”是什么意思?


Answers:


68

虽然建议的副本是Python Ellipsis对象的功能?在一般python情况下回答问题nditer,我认为在循环中使用它需要添加信息。

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

Python中的常规赋值仅更改局部或全局变量字典中的引用,而不是就地修改现有变量。这意味着简单地分配给x不会将值放置到数组的元素中,而是将x从作为数组元素的引用切换为对您分配的值的引用。要实际修改数组的元素,应使用省略号对x进行索引。

该部分包括您的代码示例。

用我的话来说,就地x[...] = ...修改xx = ...会破坏该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个暗区)上进行迭代ax是一维数组,可以用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个暗区)上进行迭代ax是一维数组,可以用x[:] = ...或修改x[...] = ...

从头到尾阅读并尝试使用此nditer页面。就其本身而言,nditer在中不是那么有用python。它不会加快迭代速度-除非将代码移植到cythonnp.ndindex是使用的少数几个未编译numpy函数之一nditer


请注意,x [1,:,...]之类的语法也是允许的语法。留作将来参考。
博尔格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.