2017-02-09 9 views
2

Я хотел бы использовать свойство flatiter.coords итератора numpy.ndarray, но я встречаю странное поведение. Рассмотрим простую программуВ numpy, почему доступ к плоттерам проходит через конец ndarray?

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

Я не знаю, является ли это действительно намеренно, но ссылается элемент и 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) 

Я склонен согласиться с вами, это выглядит как ошибка.

0

Хотя я иногда использовал 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)