2013-09-30 251 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