2011-09-16 82 views
3

我一直在尋找解決方案,這是沿着這older question行。我一直在試圖找到複製索引結果的Python代碼模式。例如:在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 

這是什麼讓我做的是,如果有一個列C訂購的BI現在可以適當地插入C的值到一個新的數組d相同的方式進行排序的方式爲A相同。我做了很多數據映射!我特別喜歡這種方式來處理各種數據類型,比如字符串和日期時間。看起來numpy的ind讓我在中途停下來。我也開放給其他Pythonic思想!

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不適用於日期時間對象。 –

+0

@ConMai:考慮將此標記爲已接受的答案。 – Amro