2017-05-22 5 views
1

多次元データ(多分4D、時には3D)よりも多くの異なるタイプの関数を実行する必要があります。 np.ndenumerateを使ってこれらの配列を列挙する効率的な方法を見つけました。ただし、これは一度に1つずつ繰り返すために1つの配列に制限されています。2つ以上の同じ形状の配列を列挙する

複数のタイプのディメンションを持つが、それらの配列内のデータを変更/更新/使用するために同じ関数を使用できるという問題を解決するには、現在の静的バージョンを変換できるようにしたいと思います。以下のようなものに

# Random data 
array1 = np.random.rand(5, 7, 50, 40) 
array2 = np.random.rand(5, 7, 50, 40) 
result = np.zeros(array1.shape) 
for (a, b, c, d), array1Data in np.ndenumerate(array1): 
    array2Data = array2[a][b][c][d] 
    result[a][b][c][d] = np.sqrt(array1Data**2 + array2Data**2) 

print(result) 

# Random data 
array1 = np.random.rand(5, 7, 50, 40) 
array2 = np.random.rand(5, 7, 50, 40) 
result = np.zeros(array1.shape) 
for indexes, array1Data, array2Data in np.ndenumerate(array1, array2): 
    result[indexes] = np.sqrt(array1Data**2 + array2Data**2) 

print(result) 
+1

は、あなただけの '結果= np.sqrt(配列1 ** 2 +配列2 ** 2)'を書くことができませんか? – chepner

+0

この例では、スキップするインデックスがある場合や、1つのライナーを避けてより自然な言語でコードを作成することが望ましい場合はいつでも、私は1か月後にそれを見ています。 – Emptyless

答えて

1

質問を入力すると、ラバーダッキーとして動作するかのように、私はヘルパー関数enumerate2Dを使用して、それを解決:

def enumerate2D(array1, array2): 
    assert array1.shape == array2.shape, "Error - dimensions." 
    for indexes, data in np.ndenumerate(array1): 
     yield indexes, data, array2[indexes] 
私は上記のように正確に使用することができます

for indexes, data1, data2 in enumerate2D(array1, array2): 
    result[indexes] = np.sqrt(data1**2 + data2**2) 
関連する問題