2013-09-30 214 views
2

我有兩個代表二維座標的numpy數組。每一行代表(x, y)對:按數值從numpy數組中刪除元素

a = np.array([[1, 1], [2, 1], [3, 1], [3, 2], [3, 3], [5, 5]]) 
b = np.array([[1, 1], [5, 5], [3, 2]]) 

我想刪除從a其在b有效的元素。所以結果是:

array([[2, 1], [3, 1], [3, 3]]) 

我可以通過循環和比較來做到這一點,我希望我可以做得更容易。

+0

這是一個重複的,我道歉,我沒有做搜索,但未能找到答案。 – enedene

+5

@enedene不用擔心,將問題標記爲重複不是指責或懲罰,它更像是指向已經有答案的地方。你更清楚地問了這個問題,imo,但答案已經存在。 – askewchan

回答

0

Python sets做出了很好的差異。它沒有,但是,維持秩序

np.array(list(set(tuple(x) for x in a.tolist()).difference(set(tuple(x) for x in b.tolist())))) 

或者用布爾檢索,利用廣播來創建一個outer equals,並且sumanyall

A = np.all((a[None,:,:]==b[:,None,:]),axis=-1) 
A = np.any(A,axis=0) 
a[~A,:] 

或者使ab複雜:

ac = np.dot(a,[1,1j]) 
bc = np.dot(b,[1,1j]) 
A = np.any(ac==bc[:,None],axis=0) 
a[~A,:] 

或使用setxor1d

xx = np.setxor1d(ac,bc) 
# array([ 2.+1.j, 3.+1.j, 3.+3.j]) 
np.array([xx.real,xx.imag],dtype=int).T 

=================

In [222]: ac = np.dot(a,[1,1j]) 
    ...: bc = np.dot(b,[1,1j]) 
In [223]: ac 
Out[223]: array([ 1.+1.j, 2.+1.j, 3.+1.j, 3.+2.j, 3.+3.j, 5.+5.j]) 
In [225]: bc 
Out[225]: array([ 1.+1.j, 5.+5.j, 3.+2.j]) 
In [226]: ac == bc[:,None] 
Out[226]: 
array([[ True, False, False, False, False, False], 
     [False, False, False, False, False, True], 
     [False, False, False, True, False, False]], dtype=bool) 
+0

我很想知道如何使a和b複合體解決這個問題。我發現它很有效,但知道原因會很好。 – rmooney

+1

使它們複雜化將每一對合併爲一個複數。對於複數,已經定義了平等。這只是減少問題維度的另一種方式。 – hpaulj