17

2 つの大きな 2 次元配列があり、それらの行を要素として取り、それらの集合の違いを見つけたいと考えています。Matlab では、このコードはsetdiff(A,B,'rows'). 配列が十分に大きいため、私が考えることができる明らかなループ方法では時間がかかりすぎます。

4

3 に答える 3

15

これは機能するはずですが、作成中のビューのマージソートが利用できないため、現在 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)])
于 2012-08-10T14:05:48.650 に答える
8

これは、1.6.1で機能する素晴らしい代替の純粋なnumpyソリューションです。中間配列を作成するため、これは問題になる場合とそうでない場合があります。また、並べ替えられた配列からの高速化にも依存しません (setdiffおそらくそうなります)。

from numpy import *
# Create some sample arrays
A =random.randint(0,5,(10,3))
B =random.randint(0,5,(10,3))

例として、これは私が得たものです - 1つの共通要素があることに注意してください:

>>> A
array([[1, 0, 3],
       [0, 4, 2],
       [0, 3, 4],
       [4, 4, 2],
       [2, 0, 2],
       [4, 0, 0],
       [3, 2, 2],
       [4, 2, 3],
       [0, 2, 1],
       [2, 0, 2]])
>>> B
array([[4, 1, 3],
       [4, 3, 0],
       [0, 3, 3],
       [3, 0, 3],
       [3, 4, 0],
       [3, 2, 3],
       [3, 1, 2],
       [4, 1, 2],
       [0, 4, 2],
       [0, 0, 3]])

行間の (L1) 距離がゼロになるときを探します。これにより、行列が得られます。行列がゼロであるポイントでは、これらは両方のリストに共通の項目です。

idx = where(abs((A[:,newaxis,:] - B)).sum(axis=2)==0)

チェックとして:

>>> A[idx[0]]
array([[0, 4, 2]])
>>> B[idx[1]]
array([[0, 4, 2]])
于 2012-08-10T14:46:49.570 に答える
-1

あなたが何をしようとしているのかわかりませんが、これにより、2 つの配列が等しくないブール配列が取得され、非常に高速になります。


import numpy as np
a = np.random.randn(5, 5)
b = np.random.randn(5, 5)
a[0,0] = 10.0
b[0,0] = 10.0 
a[1,1] = 5.0
b[1,1] = 5.0
c = ~(a-b==0)
print c

[[False True True True True] [ True False True True True] [ True True True True True] [ True True True True True] [ True True True True True]]

于 2012-08-10T14:28:23.577 に答える