4

2D 座標を表す numpy 配列が 2 つあります。各行は(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]])

効率的aに入っている要素を削除したいと思います。bしたがって、結果は次のようになります。

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

ループして比較することでできるので、もっと簡単にできると思っていました。

4

1 に答える 1

1

Pythonsetsは違いを与えるという素晴らしい仕事をします。ただし、秩序を維持するわけではありません

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

または、ブール インデックスを使用するには、ブロードキャストを使用して を作成しouter equals、 とをsum使用します。anyall

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)
于 2013-10-01T01:28:28.803 に答える