我想弄清楚一個更好的方法來檢查兩個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]
。檢查兩行是否相等:
>>>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
這很好,而且速度相當快。但是問題來時,左右兩排「閉」:
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的容差這兩個數組是按行相等,但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
值。行數可以是幾百,我需要做很多。有任何想法嗎?
我會拋出'scipy.spatial.cKDTree'(可能KDTree,取決於scipy版本和用法),對於一種可能更直接的方法。 – seberg 2013-02-19 23:16:42
這正是我正在尋找的。知道必須有更好的方法。 – Daniel 2013-02-19 23:54:42