2017-08-17 17 views
6

私はに4つの次元(今のところ...)があり、それを繰り返し処理する必要があります。このn次元データセットを反復処理する方法は?

shape = [4,5,2,6] 

shapeの値がの長さを表している:私はdatasetためshapeを得ることができ、今

value = dataset[i,j,k,l] 

は、私はこれを行う、 datasetの値にアクセスするには寸法。

次元の数を指定すると、データセット内のすべての要素を繰り返し処理できますか?次に例を示します。将来的には

for i in range(shape[0]): 
    for j in range(shape[1]): 
     for k in range(shape[2]): 
      for l in range(shape[3]): 
       print('BOOM') 
       value = dataset[i,j,k,l] 

shapeは変更されることがあります。たとえば、shapeには現在の4個ではなく10個の要素が含まれている可能性があります。

Python 3でこれを行うには素晴らしいクリーンな方法がありますか?

+0

私は[再帰]を考える(HTTP ://www.python-course.eu/recursive_functions.php)ソリューションが最適なソリューションになります。 – Yonlif

+0

[Pythonで多次元配列を反復する]の可能な複製(https://stackoverflow.com/questions/971678/iterating-through-a-multidimensional-array-in-python) –

答えて

6

あなたはいくつかの値(この場合はインデックス)のcartesian product を反復するitertools.productを使用することができます。それは、それがnumpyの配列の場合は、反復処理したいしかし

import itertools 
shape = [4,5,2,6] 
for idx in itertools.product(*[range(s) for s in shape]): 
    value = dataset[idx] 
    print(idx, value) 
    # i would be "idx[0]", j "idx[1]" and so on... 

np.ndenumerateを使用する方が簡単かもしれない:

import numpy as np 

arr = np.random.random([4,5,2,6]) 
for idx, value in np.ndenumerate(arr): 
    print(idx, value) 
    # i would be "idx[0]", j "idx[1]" and so on... 

itertools.product(*[range(s) for s in shape])が実際に行うことを明確にしてください。それでは、もっと詳しく説明します。

productを意味
for i, j in itertools.product(range(10), range(8)): 
#          ^^^^^^^^---- the inner for loop 
#        ^^^^^^^^^-------------- the outer for loop 
    # do whatever 

独立したの数を減らすだけの手軽な方法です:

for i in range(10): 
    for j in range(8): 
     # do whatever 

これもとproductを使って書くことができます。

は、たとえば、あなたは、このループを持っています for-loops等価です

# Create the "values" each for-loop iterates over 
loopover = [range(s) for s in shape] 

# Unpack the list using "*" operator because "product" needs them as 
# different positional arguments: 
prod = itertools.product(*loopover) 

for idx in prod: 
    i_0, i_1, ..., i_n = idx # index is a tuple that can be unpacked if you know the number of values. 
           # The "..." has to be replaced with the variables in real code! 
    # do whatever 

あなたはproductfor -loopsの可変数を変換したい場合は、基本的に2つのステップを必要とする

for i_1 in range(shape[0]): 
    for i_2 in range(shape[1]): 
     ... # more loops 
      for i_n in range(shape[n]): # n is the length of the "shape" object 
       # do whatever 
+0

あなたはそうする必要はありません。'[i、j、k、l]'を使った索引付けは '[(i、j、k、l)]'に相当し、 'idx'は'(i、j、k、l) 'です。それを 'dataset [idx]'で索引付けします。 :) – MSeifert