2017-02-07 18 views
1

多次元numpy配列の要素間の格子距離(水平および垂直ステップの数)を計算する関数を作成しようとしています。このためには、配列を反復処理する際に、各要素のインデックスから実際の数値を取得する必要があります。私はそれらの値を私が距離式で走れる数として保存したいと思っています。私は各要素を介して、それが1ため= 0、B = 0を取得することになる第1のエレメント1のための反復は、Aであるとループを作成したいのですが、例えばアレイnumpy配列からインデックス値を取得する

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

について

[0,0]に配置されているので、要素2のa = 0、b = 1など...

私の想定される出力は2つの数字ですその要素のインデックス値)を返します。上記の例では、私はaとbになるように2つの値を割り当てます。私はループ内でこれらの2つの数値を取り出す必要があります(別のデータオブジェクトとして別々に保存するのではなく)。

これを行う方法についてのご意見をお待ちしております。

+0

を、あなたはあなたの例のサンプル期待出力を与えることができますか?これまでのところ、インデックスのすべてのペアのリスト/配列が必要なように聞こえます。 – DyZ

+0

提案された説明をありがとう!まだ明らかでないかどうか私に教えてください。 – yogz123

+0

リスト/配列は問題ありませんが、さらに簡単には、各繰り返し内で2つのインデックス値を取得する必要があります。 – yogz123

答えて

4

配列内の値をnumpy.ndenumerateで反復処理して、配列内の値のインデックスを取得できます。

上記のドキュメントを使用する:

A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
for index, values in np.ndenumerate(A): 
    print(index, values) # operate here 
1

もう1つの可能な解決策:この場合

import numpy as np 

A=np.array([[1,2,3],[4,5,6],[7,8,9]]) 
for _, val in np.ndenumerate(A): 
    ind = np.argwhere(A==val) 
    print val, ind 

を価値がない、一度配列に表示された場合は、インデックスの配列を取得します。

1

np.ndenumerateを使用して実行できますが、一般的には配列を反復処理する必要はありません。

メッシュグリッド(またはグリッドを開く)を作成するだけで、すべてのインデックスを一度に取得することができます。その結果、より迅速に処理(ベクトル化)できます。例えば

>>> x, y = np.mgrid[slice(A.shape[0]), slice(A.shape[1])] 
>>> x 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2]]) 
>>> y 
array([[0, 1, 2], 
     [0, 1, 2], 
     [0, 1, 2]]) 

、これらは、他の配列のように処理することができるため

。したがって、インデックスを必要とする関数をベクトル化できる場合は、手動ループを行うべきではありません!点に各点の格子の距離を算出する。例えば

(2, 3)を言う:

距離 ogridについて
>>> abs(x - 2) + abs(y - 3) 
array([[5, 4, 3], 
     [4, 3, 2], 
     [3, 2, 1]]) 

が速くなるであろう。ただ、np.ogridnp.mgridを置き換える:問題のあなたの説明が理解し、やや難しいですよう

>>> x, y = np.ogrid[slice(A.shape[0]), slice(A.shape[1])] 
>>> np.hypot(x - 2, y - 3) # cartesian distance this time! :-) 
array([[ 3.60555128, 2.82842712, 2.23606798], 
     [ 3.16227766, 2.23606798, 1.41421356], 
     [ 3.  , 2.  , 1.  ]]) 
+1

これは明らかに編集を明確にすることにより "より正確"であり、配列が非常に大きい場合には処理時間を節約するはずです。 – ti7

関連する問題