通过值删除numpy数组中的元素

4

我有两个numpy数组,它们代表2D坐标。每行表示一个(x, y)对:

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

我希望能够有效地从b中删除a的元素。因此,结果将会是这样的:
array([[2, 1], [3, 1], [3, 3]])

我可以通过循环和比较来完成,但我希望能够更轻松地完成它。


这是一个重复的问题,我很抱歉,我已经搜索过了,但是没有找到答案。 - enedene
5
不用担心,标记一个问题为重复并不是指责或训斥,而更像是指向已经有答案的地方。我认为你的问题表述更清楚,但答案已经存在于那里。 - askewchan
1个回答

1
Python中的sets可以很好地提供差异,但不保留顺序。
np.array(list(set(tuple(x) for x in a.tolist()).difference(set(tuple(x) for x in b.tolist()))))

或者使用布尔索引,使用广播创建一个外部等于,并使用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)

我很好奇如何将a和b变成复杂类型会解决这个问题。我知道它可以工作,但是了解原因会更好。 - rmooney
1
将它们复杂化可以将每个对组合成一个复数。同时对于复数已经定义了等式。这只是减少问题维度的另一种方式。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接