我有两个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]])
我可以通过循环和比较来完成,但我希望能够更轻松地完成它。
我有两个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]])
我可以通过循环和比较来完成,但我希望能够更轻松地完成它。
sets
可以很好地提供差异,但不保留顺序。np.array(list(set(tuple(x) for x in a.tolist()).difference(set(tuple(x) for x in b.tolist()))))
或者使用布尔索引,使用广播创建一个外部等于
,并使用sum
、any
和all
A = np.all((a[None,:,:]==b[:,None,:]),axis=-1)
A = np.any(A,axis=0)
a[~A,:]
或者让a
和b
变得复杂:
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)