在2个单独的numpy数组中查找匹配点



我有两个不同大小的数组,其中包含3d点。我想有效地比较这两个数组,找到匹配的点,并最终返回简单数量的匹配点。

pA=[[0,0,0],[0,1,0],[1,2,4],[10,3,4],[1,20,1],[5,3,2]]
pB=[[14,1,0],[1,2,4],[1,20,1],[15,1,0]]
#returns 2

目前,我有一个草率的循环,可以做到这一点,但它对性能不是很友好,这是一个问题,因为我正在尝试将许多对阵列与更多的点进行匹配

t= np.array([pA[x]==pB for x in range(len(pA))]).sum(2)
print np.sum(t==3)

我只是不知道如何有效地比较两个不同大小的多维数组。然后是如何对大量的对进行多次迭代。

编辑

找到了一个非常快速的变通方法,它可以组合数组,生成唯一版本的数组,然后比较两个数组的长度。

pts=np.concatenate((pA,pB),axis=0)
pts2 = np.unique(pts.view([('', pts.dtype)]*pts.shape[1]))
return len(pts)-len(pts2)

不知道这在整个数据集上是如何执行的,但请尝试使用Scipy的kdtree:

from scipy.spatial import cKDTree
pA=[[0,0,0],[0,1,0],[1,2,4],[10,3,4],[1,20,1],[5,3,2]]
pB=[[14,1,0],[1,2,4],[1,20,1],[15,1,0]]
kdtree = cKDTree(pA)
dists, inds = kdtree.query(pB, distance_upper_bound=1e-5)
result = (dists == 0).sum()
  • http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.cKDTree.html#scipy.spatial.cKDTree

这里有一种只使用numpy操作的方法。这里的基本思想是,我们将这两个列表连接到一个numpy数组中。然后,我们按行排序,使匹配点位于连续行。接下来,我们执行diff以获得匹配行的所有零行,这是np.all(...==0,1)拾取的。我们对所有这些出现进行计数,以获得这两个列表之间匹配点计数的期望输出。

实施情况如下所示-

import numpy as np
# Inputs
pA=[[0,0,0],[0,1,0],[1,2,4],[10,3,4],[1,20,1],[5,3,2]]
pB=[[14,1,0],[1,2,4],[1,20,1],[15,1,0]]
# Form concatenate array of pA and pB
pts = np.concatenate((pA,pB),axis=0)
# Sort pts by rows
spts = pts[pts[:,1].argsort(),]
# Finally get counts by DIFFing along rows and counting all zero rows
counts = np.sum(np.diff(np.all(np.diff(spts,axis=0)==0,1)+0)==1)

输出-

In [152]: counts
Out[152]: 2

即使在任何一个列表中都有重复的点,上面的代码也能工作。因此,让我们在早期代码的输入中添加一些重复点

# Inputs
pA=[[0,0,0],[0,1,0],[1,2,4],[10,3,4],[1,20,1],[5,3,2],[1,2,4]]
pB=[[14,1,0],[1,2,4],[1,20,1],[15,1,0],[1,2,4]]

在使用修改的输入运行代码之后,输出仍然保持为2,这是预期的输出。

如果你确定在任何一个列表中都没有重复的条目,你可以使用一个简化的版本来代替最后一步-

counts = np.sum(np.all(np.diff(spts,axis=0)==0,1))

相关内容

  • 没有找到相关文章

最新更新