2016-08-26 22 views
1

多次元配列のクエリの配列のインデックスを見つける方法を探しています。たとえば:多次元numpy配列の複数のクエリのインデックスを見つける

arr = np.array([[17, 5, 19, 9], 
    [18, 13, 3, 7], 
    [ 8, 1, 4, 2], 
    [ 8, 9, 7, 19], 
    [ 6, 11, 8, 5], 
    [11, 16, 13, 18], 
    [ 0, 1, 2, 9], 
    [ 1, 7, 4, 6]]) 

私は1つのクエリのためのインデックスを見つけることができます。

np.where(arr==1) 
# (array([2, 6, 7]), array([1, 1, 0])) 

を次forループを交換する複数の値のためにこれを行うには、任意のnumpyの解決策はありますか?

for q in queries: 
    np.where(arr==q) 

アレイとクエリの両方が一次元であった場合、私はthis answerとしてsearchsortedを使用することができるが、それは、多次元配列では動作しません。

答えて

1

where関数の結果を圧縮し、参照元演算子*を使用すると、それぞれの一致する値のインデックスを取得できます。

arr = np.array([[17, 5, 19, 9], 
       [18, 13, 3, 7], 
       [ 8, 1, 4, 2], # (2, 1) 
       [ 8, 9, 7, 19], 
       [ 6, 11, 8, 5], 
       [11, 16, 13, 18], 
       [ 0, 1, 2, 9], # (6, 1) 
       [ 1, 7, 4, 6]]) # (7, 0) 

>>> zip(*np.where(arr == 1)) 
[(2, 1), (6, 1), (7, 0)] 

は私があなたの意図した出力が何であるかわからないんだけど、あなたは例えば、渡された数値セットのインデックスの場所を表示するには辞書内包表記を使用することができます。

>>> {n: zip(*np.where(arr == n)) for n in range(5)} 
{0: [(6, 0)], 
1: [(2, 1), (6, 1), (7, 0)], 
2: [(2, 3), (6, 2)], 
3: [(1, 2)], 
4: [(2, 2), (7, 2)]} 
+0

ありがとうございましたが、私は 'q'の異なる値に対して' np.where(arr == q) 'を得たかったのです! – Mahdi

+0

'q'の各値または' q'のすべての値のインデックスを求めますか? – Alexander

+0

>>> ix = np.in1d(arr.ravel()、[1,8,18])。reshape(arr.shape)... >>> found = np.array(list(zip(* np.where(ix))))...リストはPython 3で必要です。 –

2

IIUCあなたが試すことこれは:

In[19]:np.where((arr==4)|(arr==5)) 
Out[19]: (array([0, 2, 4, 7], dtype=int64), array([1, 2, 3, 2], dtype=int64)) 
関連する問題