我有一个shape(nx3)的二维数组,比如说arr1。现在考虑第二个数组arr2,其形状与arr1相同,并具有相同的行。但是,行的顺序不同。我想像在arr1中一样获取arr2中每一行的索引。我正在寻找最快的Python方式来完成此操作,因为n约为10,000。
例如:
arr1 = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2 = numpy.array([[4, 5, 6], [7, 8, 9], [1, 2, 3]])
ind = [1, 2, 0]
请注意,行元素不必为整数。实际上,它们是花车。我找到了使用numpy.searchsorted的相关答案,但它们仅适用于一维数组。
如果确保arr2
是的排列arr1
,则可以使用sort获取索引:
import numpy as np
n = 100000
a1 = np.random.randint(0, 100, size=(n, 3))
a2 = a1[np.random.permutation(np.arange(n))]
idx1 = np.lexsort(a1.T)
idx2 = np.lexsort(a2.T)
idx = idx2[np.argsort(idx1)]
np.all(a1 == a2[idx])
如果它们的值不完全相同,则可以在scipy中使用kdTree:
n = 100000
a1 = np.random.uniform(0, 100, size=(n, 3))
a2 = a1[np.random.permutation(np.arange(n))] + np.random.normal(0, 1e-8, size=(n, 3))
from scipy import spatial
tree = spatial.cKDTree(a2)
dist, idx = tree.query(a1)
np.allclose(a1, a2[idx])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句