Как я могу пройти через массив NumPy 3D - PullRequest
0 голосов
/ 11 сентября 2018

Итак, у меня есть массив:

array([[[27, 27, 28],
        [27, 14, 28]],

       [[14,  5,  4],
        [ 5,  6, 14]]])

Как я могу пройти через это и на каждой итерации получить значения [a, b, c], я пытаюсь так:

for v in np.nditer(a):
    print(v)

но он просто печатает

27
27
28
27
14
28
14
5
4
5
6

Мне нужно:

[27 27 28]
[27 14 28]...

Ответы [ 6 ]

0 голосов
/ 12 сентября 2018

Измените массив A (форма которого n1, n2, 3) на массив B (форма n1 * n2, 3) и выполните итерацию по B.Обратите внимание, что B - это просто A.A и B совместно используют один и тот же блок данных в памяти, но они имеют различную информацию заголовков массива, где записываются их формы, и изменение значений в B также изменит значение A.Код ниже:

    a = np.array([[[27, 27, 28],[27, 14, 28]],
                  [[14,  5,  4],[ 5,  6, 14]]])   
    b = a.reshape((-1, 3))   
    for last_d in b:
        a, b, c = last_d
        # do something with last_d or a, b, c
0 голосов
/ 11 сентября 2018

Другая альтернатива (полезна для произвольной размерности массива, содержащего n-кортежи):

a_flat = a.ravel()
n = 3   
m = len(a_flat)/n
[a_flat[i:i+n] for i in range(m)]

или в одну строку (медленнее):

[a.ravel()[i:i+n] for i in range(len(a.ravel())/n)]

или для дальнейшего использованиявнутри цикла:

for i in range(len(a.ravel())/n):
    print a.ravel()[i:i+n]
0 голосов
/ 11 сентября 2018

По-видимому, вы хотите выполнить итерации по первым двум измерениям массива, возвращая 3-е (как массив 1d).

In [242]: y = np.array([[[27, 27, 28],
     ...:         [27, 14, 28]],
     ...: 
     ...:        [[14,  5,  4],
     ...:         [ 5,  6, 14]]])

Двойные циклы в порядке, как и преобразование в (4,2)и итерации.

nditer обычно не требуется или не поощряется как механизм итерации (его документация нуждается в более строгом отказе от ответственности).Это действительно предназначено для кода уровня C.Он мало используется в коде уровня Python.Единственным исключением является функция np.ndindex, которая может быть полезна в этом случае:

In [244]: for ij in np.ndindex(y.shape[:2]):
     ...:     print(ij, y[ij])
     ...:     
(0, 0) [27 27 28]
(0, 1) [27 14 28]
(1, 0) [14  5  4]
(1, 1) [ 5  6 14]

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

По возможности, старайтесь работать без итераций.Итерация с любым из этих приемов относительно медленная.

0 голосов
/ 11 сентября 2018

Думайте об этом как о наличии массивов в массиве.Таким образом, в массиве v у вас есть массив a , который в свою очередь содержит триплеты b

import numpy as np
na = np.array

v=na([[[27, 27, 28], [27, 14, 28]], [[14,  5,  4],[ 5,  6, 14]]])

for a in v:
    for b in a:
        print b

Вывод:

[27 27 28]
[27 14 28]
[14  5  4]
[ 5  6 14]

В качестве альтернативы вы можете сделать следующее:

v2 = [b for a in v for b in a]

Теперь все ваши триплеты хранятся в v2

[array([27, 27, 28]),
 array([27, 14, 28]),
 array([14,  5,  4]),
 array([ 5,  6, 14])]

.. и вы можете обращаться к ним как1D массив например

print v2[0]

дает ..

array([27, 27, 28])
0 голосов
/ 11 сентября 2018
b = a.reshape(-1, 3)
for triplet in b:
    ...
0 голосов
/ 11 сентября 2018

Вы могли бы сделать что-то уродливое, как

for i in range(len(your_array)):
    for j in range(len(your_array[i])):
        print(your_array[i][j])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...