2011-09-16 12 views
3

私は、このolder questionの行に沿った解決策のために私の脳を抱きしめています。私は、インデックスの結果を複製するPythonコードパターンを見つけようとしています。例:CはAと同じように命じているBIは今、適切に新しい配列DにCの値を挿入することができますと同じように命じた配列がある場合、これは私が行うことができますどのようなNumPyでMatlabのISMEMBER関数のインデックス結果を複製するには?

A = [3;4;4;3;6] 
B = [2;5;2;6;3;2;2;5] 
[tf ix] = ismember(A,B) 
>> A(tf) 

ans = 

    3 
    3 
    6 
>> B(ix(tf)) 

ans = 

    3 
    3 
    6 

です私はこのデータのマッピングを多くしています!私はこれが特に文字列やdatetimesのようなさまざまなデータ型で動作するのが大好きです。それはnumpyのin1dは私の半分そこに得るようだ。私はまた、他のPythonのアイデアにもオープンしています!

D(tf) = C(ix(tf)) 

ありがとうございます!

答えて

5
import numpy as np 

A = np.array([3,4,4,3,6]) 
B = np.array([2,5,2,6,3,6,2,2,5]) 

def ismember(a, b): 
    # tf = np.in1d(a,b) # for newer versions of numpy 
    tf = np.array([i in b for i in a]) 
    u = np.unique(a[tf]) 
    index = np.array([(np.where(b == i))[0][-1] if t else 0 for i,t in zip(a,tf)]) 
    return tf, index 

tf,ix=ismember(A,B) 
print(tf) 
# [ True False False True True] 
print(ix) 
# [4 0 0 4 5] 
print(A[tf]) 
# [3 3 6] 
print(B[ix[tf]]) 
# [3 3 6] 
+0

お試しください!私は自分の答えに取り組む時間がなかった。 – Benjamin

+0

ありがとうございます!これは完全に機能します。また、np.in1dはdatetimeオブジェクトでは動作しないことも学びました。 –

+0

@ConMai:これを受け入れられた回答としてマークすることを検討してください。 – Amro

関連する問題