我有两个希望合并的2d点云(oldPts和newPts)。它们是mx2和nx2 numpyinteger数组,m和n的顺序为2000。newPts包含oldPts的许多重复项或几乎重复项,我需要在合并之前将其删除。
到目前为止,我已经使用histogram2d函数生成oldPts(H)的2d表示形式。然后,我将每个newPt与H的NxN区域进行比较,如果为空,则接受该点。我目前正在使用的Python循环的最后一部分,我想将其删除。谁能告诉我如何通过广播做到这一点,或者可以提出解决问题的完全不同的方法。工作代码在下面
$("#submit-button").on('click', function() { ....
答案 0 :(得分:0)
正确的方法是使用线性代数计算每对2个长矢量之间的距离,然后仅接受与每个旧点“足够不同”的新点:使用{{3} }:
import numpy as np
oldPts = np.random.randn(1000,2)
newPts = np.random.randn(2000,2)
from scipy.spatial.distance import cdist
dist = cdist(oldPts, newPts)
print(dist.shape) # (1000, 2000)
okIndex = np.max(dist, axis=0) > 5
print(np.sum(okIndex)) # prints 1503 for me
finalNew = newPts[okIndex,:]
print(finalNew.shape) # (1503, 2)
以上,我使用5的欧几里得距离作为“太接近”的阈值:newPts
中任何比oldPts
的所有点都远5的点都被接受。您必须查看finalPts
中的值范围才能找到合适的阈值,但是直方图可以指导您选择最佳阈值。
(可视化dist
的一种好方法是使用dist
。)
这是您对直方图所做的更完善的版本。实际上,您应该通过将matplotlib.pyplot.imshow(dist)
关键字参数传递给metric='minkowski', p=1
来获得与直方图完全相同的答案,假设直方图bin宽度在两个维度上都相同,然后再次使用5作为阈值。
(PS。如果您对cdist
中的另一个有用功能感兴趣,请选中scipy.spatial.distance.cdist
。)