在numpy,为什么flatiter要经过ndarray的尽头?

在numpy,为什么flatiter要经过ndarray的尽头?,numpy,multidimensional-array,iterator,Numpy,Multidimensional Array,Iterator,我想使用numpy.ndarray迭代器的flatiter.coords属性,但我遇到了奇怪的行为。考虑简单的程序 xflat = np.zeros( (2, 3) ).flat while True: try: print( xflat.coords ) xflat.next() except StopIteration: break 此代码生成以下输出: (0, 0) (0, 1) (0, 2) (1, 0) (1, 1)

我想使用numpy.ndarray迭代器的flatiter.coords属性,但我遇到了奇怪的行为。考虑简单的程序

xflat = np.zeros( (2, 3) ).flat

while True:
    try:
        print( xflat.coords )
        xflat.next()
    except StopIteration:
        break
此代码生成以下输出:

(0, 0)
(0, 1)
(0, 2)
(1, 0)
(1, 1)
(1, 2)
(2, 0)
最后一个坐标无效-没有(2,0)坐标。这意味着在没有进一步检查的情况下,我不能使用flatiter.coords属性,因为它将抛出一个无效索引


为什么会这样?它是故意的吗?

我不知道它是否真的是故意的,但引用的元素和坐标似乎只是一次性的:

Help on getset descriptor numpy.flatiter.coords:

coords
An N-dimensional tuple of current coordinates.

Examples
--------
>>> x = np.arange(6).reshape(2, 3)
>>> fl = x.flat
>>> fl.coords
(0, 0)
>>> fl.next()
0
>>> fl.coords
(0, 1)

我倾向于同意你的看法,它看起来像一个bug。

虽然我有时使用
x.flat
以一种松散的形式引用数组,但我从未使用或见过
coords
的用法

In [136]: x=np.arange(6).reshape(2,3)    
In [137]: xflat = x.flat
In [138]: for v in xflat:
     ...:     print(v, xflat.index, xflat.coords)
     ...:     
0 1 (0, 1)
1 2 (0, 2)
2 3 (1, 0)
3 4 (1, 1)
4 5 (1, 2)
5 6 (2, 0)
似乎
index
coords
引用的是下一个值,而不是当前值。对于第一行,当前索引为0,坐标为(0,0)。所以最后一个确实是“结束了”,这将是迭代退出的原因

In [155]: xflat=x.flat
In [156]: xflat.coords, xflat.index
Out[156]: ((0, 0), 0)
下面是我如何使用
flat

In [143]: y=np.zeros((3,2))
In [144]: y.flat[:] = x.flat
In [145]: y
Out[145]: 
array([[ 0.,  1.],
       [ 2.,  3.],
       [ 4.,  5.]])
我不会将其用于索引迭代

这样更好:

In [147]: for i,v in np.ndenumerate(x):
     ...:     print(i,v)
     ...:     
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
或对于1d迭代:

for i,v in enumerate(x.flat):
    print(i,v)