我想使用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属性,因为它将抛出无效索引。
为什么会这样?这是打算吗?
答案 0 :(得分:0)
我不知道这是否真的是故意的,但引用的元素和坐标似乎只有一个:
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)
我倾向于同意你的意见,这看起来像是一个错误。
答案 1 :(得分:0)
虽然我偶尔使用x.flat
以ravel形式引用数组,但我从未使用或看过使用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,并且为coords(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)