Переберите все элементы ndarray по одному - PullRequest
0 голосов
/ 23 мая 2018
In [6]: a = np.array([[1,2,3,4],[5,6,7,8]])

In [7]: b = a

In [8]: a[0]
Out[8]: array([1, 2, 3, 4])

In [9]: a[0][0]
Out[9]: 1

Но я хотел бы использовать zip и пройти через a и b и получить a[0][0], затем a[0][1] и так до тех пор, пока не достигну a[1][3].

Когда я пытаюсь сделать следующее:

In [11]: for i,j in zip(a,b):
    ...:     print i[0][0]
    ...:     
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-11-8a9c71fab781> in <module>()
      1 for i,j in zip(a,b):
----> 2     print i[0][0]
      3 

IndexError: invalid index to scalar variable.

Я хотел бы получить a[0][0] = 1, затем a[0][1] = 2 до a[0][3] = 4, затем получить a[1][0] = 5 и так далеедо a[1][3] = 8.

Ответы [ 5 ]

0 голосов
/ 23 мая 2018

Один из способов получения индекса и индексации заключается в использовании np.nditer:

>>> a = np.arange(1,9).reshape(2,4)
>>> b = -a
>>> 
>>> it = np.nditer((a, b), order='C', flags=('multi_index',))
>>> for i, j in it:
...     print(it.multi_index, i, j)
... 
(0, 0) 1 -1
(0, 1) 2 -2
(0, 2) 3 -3
(0, 3) 4 -4
(1, 0) 5 -5
(1, 1) 6 -6
(1, 2) 7 -7
(1, 3) 8 -8

. В качестве бесплатного бонуса, при необходимости, вещание происходит:

>>> a, b = np.ogrid[1:3, 2:6]
>>> a.shape, b.shape
((2, 1), (1, 4))
>>> 
>>> it = np.nditer((a, b), order='C', flags=('multi_index',))
>>> for i, j in it:
...     print(it.multi_index, i, j)
... 
(0, 0) 1 2
(0, 1) 1 3
(0, 2) 1 4
(0, 3) 1 5
(1, 0) 2 2
(1, 1) 2 3
(1, 2) 2 4
(1, 3) 2 5
0 голосов
/ 23 мая 2018
In [333]: a = np.array([[1,2,3,4],[5,6,7,8]])
In [334]: a
Out[334]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

Удобный способ получения значений вместе с их индексами - ndenumerate.

In [335]: np.ndenumerate(a)
Out[335]: <numpy.lib.index_tricks.ndenumerate at 0x7f39160b5160>
In [336]: list(_)
Out[336]: 
[((0, 0), 1),
 ((0, 1), 2),
 ((0, 2), 3),
 ((0, 3), 4),
 ((1, 0), 5),
 ((1, 1), 6),
 ((1, 2), 7),
 ((1, 3), 8)]

. Он создает iter = a.flat a flatiter объект, а затем повторяет его, возвращая coords и next.

Если вам нужны только значения, а не координаты

In [19]: list(a.flat)
Out[19]: [1, 2, 3, 4, 5, 6, 7, 8]

ndindex можно использовать для генерации индексов для заданной фигуры:

In [20]: idx=np.ndindex(a.shape)
In [21]: [(ij, a[ij]) for ij in idx]
Out[21]: 
[((0, 0), 1),
 ((0, 1), 2),
 ((0, 2), 3),
 ((0, 3), 4),
 ((1, 0), 5),
 ((1, 1), 6),
 ((1, 2), 7),
 ((1, 3), 8)]
0 голосов
/ 23 мая 2018

Исходя из желаемого результата 1, 2, ..., 4, 5, ..., 8, вы можете использовать itertools.chain для итерации значений:

import numpy as np
from itertools import chain

a = np.array([[1,2,3,4],[5,6,7,8]])

for i in chain.from_iterable(a):
    print(i)

1
2
3
4
5
6
7
8
0 голосов
/ 23 мая 2018

Я попробую это

a = np.array([[1,2,3,4],[5,6,7,8]])
for row in [0,1]:
    for column in range(4):
        print('a[%s][%s] = %s' % (row, column, a[row][column]))

отпечатков:

a[0][0] = 1
a[0][1] = 2
a[0][2] = 3
a[0][3] = 4
a[1][0] = 5
a[1][1] = 6
a[1][2] = 7
a[1][3] = 8
0 голосов
/ 23 мая 2018

Если вам просто необходимо пройти через все элементы a один за другим, вот для чего ndarray.flat:

In [11]: a = np.array([[1,2,3,4],[5,6,7,8]])

In [13]: for i in a.flat: print(i)
1
2
3
4
5
6
7
8

Loopingover a.flatten() даст тот же результат, но он создаст отдельный ndarray и скопирует данные.

.flat также более эффективен, чем itertools.chain.from_iterable(a), потому что последнийвключает в себя получение полных строк из a в виде представлений, а затем итерацию по ним, т. е. множество дополнительных операций.


Если вам необходимо знать индексы во время итерации, используйте numpy.ndenumerate вместо этого согласно Итерации по массиву numpy :

In [34]: for (x,y),i in np.ndenumerate(a): print("a[%d][%d]=%d"%(x,y,i))
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[0][3]=4
a[1][0]=5
a[1][1]=6
a[1][2]=7
a[1][3]=8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...