2017-05-10 7 views
0

は、ソートされた配列Aと私はそれが検索手段Pythonは、マトリクス状に配列のインデックスを検索し

results = np.array([[0, 2, 1, 4], 
        [1, 2, 3, 5], 
        [1, 2, 3, 4]] 
        ) 

ような結果を得ることができる

a = np.array([11,30,60,70]) 

b = np.array([[11, 2, 30, 4], 
       [30, 60, 70, 5], 
       [1, 2, 3, 4]] 
      ) 

行列Bがあると異なる値を与えます配列aの各要素を行列bに置き、配列aを配列aのインデックスに置き換えます。

私はそれが少し複雑である知っている、私は私の質問はループせずにそれを行うための任意のチャンスがある

def set_values_found_to_index(matrix_original, values_to_find): 

"""Set value found to index.""" 

for index, elem in enumerate(values_to_find): 

    matrix_original[np.where(

      values_to_find == values_to_find[index] 

    )] = index 

return matrix_original 

ループでそれを行っていますか?

更新:リンゴと梨のミックスについて曖昧な質問がまだあるので、@NilsWernerコードは、上記の質問に関しては完璧に動作しますので、私は質問更新:

a = np.array([11,30,60,70]) 

b = np.array(
      [[11, 2, 30], 
       [30, 60, 70], 
       [20, 30, 50], 
       [11, 30, 60], 
       [30, 11, 70], 
       [70, 11, 60], 
       [1, 2, 3]] 
      ) 
results = np.array(
        [[1,2,3], 
        [0,1,2], 
        [1,0,3], 
        [3,0,2]] 
        ) 

これは、上記に基づく手段をリンゴとナシのミックスの問題は、a.maxより大きいa.min()よりも大きいa.max()よりも大きい要素を含む行を削除することで解決できます。

+0

関連:[numpyの配列の値の高速交換](https://stackoverflow.com/q/3403973/ 846892) –

+0

'results'では、要素を見つけたらインデックスを置きます。それ以外の場合は、値を行列に保持します。あなたはリンゴと梨を混ぜています! 2の位置(0,1)は行列の元の値であり、2の(2)の2は配列の要素70のインデックスである。これがあなたが望むものだと確信していますか? –

+0

@SembeiNorimakiそれは私が欲しいものですが、私は質問にバグがあることに気付きました。キューに感謝します。ちょうどそれを修正した。 – user3922048

答えて

0

np.searchsorted(a, b[~np.any(~np.in1d(b, a).reshape(b.shape), axis=1), :]) 
+0

ありがとう、それは私のために働く。私はもう少しそれをテストします。 – user3922048

+0

問題を解決しますか? –

+0

まずは、上記の質問を解決していただきありがとうございます。しかし@SembeiNorimakiが述べたように、リンゴとナシを混ぜるのに問題があるでしょう。 aとbが非常に大きい場合、結果はあいまいであることを意味します。たとえば、結果[1,1]は計算結果ではない結果[0,1]と同じです。だから私が改善したいのは、要素を含む行を要素の間で取り除こうとすることです。私は質問を更新しました。 – user3922048

0
translation = dict(map(reversed, enumerate(a))) 
translate = np.vectorize(lambda i: translation.get(i, i)) 
results = translate(b) 

translationaの辞書マッピング要素をインデックスに作成します。 translateは、呼び出されたオブジェクト内のすべての要素に関数を適用するvectorizeオブジェクトです。この場合の関数は、translationにマップされた値を取得しようとしますが、見つからなければ元の値を返します。あなたはnp.in1dnp.searchsortedの組み合わせを使用することができ、完全にベクトル化されたソリューションについては

+0

返信いただきありがとうございます。ループを削除する機会はありますか?私は大きな変種aとbを持っているからです。 – user3922048

+0

@ user3922048私はdictの理解でforループを削除しましたが、Cでちょうど下にある 'a'と' b'をループしているので、大きな 'a'と' b'の方が速いはずです。 – Artyer

関連する問題