Доступ к каждому элементу многомерного массива, не зная отдельных измерений - PullRequest
1 голос
/ 06 января 2020

У меня есть многомерный массив, но я не буду знать количество измерений или размер каждого измерения. Как я могу обобщить код так, чтобы я мог получить доступ к каждому элементу массива индивидуально?

import numpy as np
import random

myRand = np.random.rand(5, 6, 7)

#print (myRand.shape[0])
# This works great if I already know that myRand has 3 dimensions. What if I don't know that?
mySum = 0.0
for i in range(myRand.shape[0]):
    for j in range(myRand.shape[1]):
        for k in range(myRand.shape[2]):
#           Do something with myRand[i,j,k]

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вы можете использовать itertools для этого.

следующий фрагмент кода сгенерирует индексы, к которым вы сможете обращаться к массиву при их получении:

import numpy as np
import itertools

v1 = np.random.randint(5, size=2)
v2 = np.random.randint(5, size=(2, 4))
v3 = np.random.randint(5, size=(2, 3, 2))

# v1
args1 = [list(range(e)) for e in list(v1.shape)]
print(v1)
for combination in itertools.product(*args1):
    print(v1[combination])

# v2
args2 = [list(range(e)) for e in list(v2.shape)]
print(v2)
for combination in itertools.product(*args2):
    print(v2[combination])

# v3
args3 = [list(range(e)) for e in list(v3.shape)]
print(v3)
for combination in itertools.product(*args3):
    print(v3[combination])

Протестировано на простых массивах разных размеров и отлично работает.

1 голос
/ 06 января 2020

Если вам не нужно сохранять индексы в каждом из измерений для расчета, вы можете просто использовать numpy.nditer

>>> a = np.arange(8).reshape((2, 2, 2))
>>> a
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

>>> for i in np.nditer(a):
...     print(i)
...
0
1
2
3
4
5
6
7

Вы не должны действительно не нужно перебирать массив, используя for-l oop, как это. Обычно есть лучший способ выполнить любое вычисление, которое вы делаете, используя numpy методы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...