Pythonで2つの大きな配列(行列)の差集合を求める 質問する

Pythonで2つの大きな配列(行列)の差集合を求める 質問する

2 つの大きな 2 次元配列があり、その行を要素としてそれらの差集合を求めたいと思います。 Matlab では、このコードは次のようになりますsetdiff(A,B,'rows')。 配列が大きすぎるため、考えられる明らかなループ メソッドでは時間がかかりすぎます。

ベストアンサー1

これすべき動作しますが、現在 1.6.1 では、作成されるビューのマージソートが利用できないために動作しません。これは、プレリリース バージョン 1.7.0 では動作します。ビューはメモリをコピーする必要がないため、これが可能な限り最速の方法です。

>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = a1.view([('', a1.dtype)] * a1.shape[1])
>>> a2_rows = a2.view([('', a2.dtype)] * a2.shape[1])
>>> np.setdiff1d(a1_rows, a2_rows).view(a1.dtype).reshape(-1, a1.shape[1])
array([[1, 2, 3]])

Python でもこれを行うことはできますが、遅くなる可能性があります。

>>> import numpy as np
>>> a1 = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a2 = np.array([[4,5,6],[7,8,9],[1,1,1]])
>>> a1_rows = set(map(tuple, a1))
>>> a2_rows = set(map(tuple, a2))
>>> a1_rows.difference(a2_rows)
set([(1, 2, 3)])

おすすめ記事