我正在尝试找出一种更好的方法来检查两个二维数组是否包含相同的行。以以下示例为简短示例:
在这种情况下,
这很好而且相当快。但当两行“靠近”时,问题就出现了:
>>> 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
(根据scipy版本和用法可能是KDTree),作为一种更直接的方法。 - seberg