2 つの 2D 配列に同じ行が含まれているかどうかを確認するより良い方法を見つけようとしています。簡単な例として、次のケースを取り上げます。
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b
array([[6, 7, 8],
[3, 4, 5],
[0, 1, 2]])
この場合b=a[::-1]
。2 つの行が等しいかどうかを確認するには、次のようにします。
>>>a=a[np.lexsort((a[:,0],a[:,1],a[:,2]))]
>>>b=b[np.lexsort((b[:,0],b[:,1],b[:,2]))]
>>> np.all(a-b==0)
True
これは素晴らしく、かなり高速です。ただし、2 つの行が「近い」場合に問題が発生します。
array([[-1.57839867 2.355354 -1.4225235 ],
[-0.94728367 0. -1.4225235 ],
[-1.57839867 -2.355354 -1.4225215 ]]) <---note ends in 215 not 235
array([[-1.57839867 -2.355354 -1.4225225 ],
[-1.57839867 2.355354 -1.4225225 ],
[-0.94728367 0. -1.4225225 ]])
1E-5 の許容範囲内で、これら 2 つの配列は行ごとに等しくなりますが、それ以外の場合は lexsort が教えてくれます。これは別の並べ替え順序で解決できますが、より一般的なケースが必要です。
私は次のアイデアをいじっていました:
a=a.reshape(-1,1,3)
>>> a-b
array([[[-6, -6, -6],
[-3, -3, -3],
[ 0, 0, 0]],
[[-3, -3, -3],
[ 0, 0, 0],
[ 3, 3, 3]],
[[ 0, 0, 0],
[ 3, 3, 3],
[ 6, 6, 6]]])
>>> np.all(np.around(a-b,5)==0,axis=2)
array([[False, False, True],
[False, True, False],
[ True, False, False]], dtype=bool)
>>>np.all(np.any(np.all(np.around(a-b,5)==0,axis=2),axis=1))
True
b
のすべての点が の値に近い場合、配列が行ごとに等しいかどうかはわかりませんa
。行数は数百になる可能性があり、かなりの量を実行する必要があります。何か案は?