【发布时间】:2021-07-18 17:41:15
【问题描述】:
我有一个大约 [5000000 x 6] 的数组,我只需要选择彼此相距一定距离的点(行)。
想法应该是:
从数据数组的第一行开始new_array
将 new_array 与数据数组中的第二行进行比较
如果它们之间的 pdist > tol,则将行追加到 new_array
将 new_array 与数据数组中的第三行进行比较
等等……
一个问题是 RAM 大小。即使在 pdist 中,我也无法一次比较所有行。
所以我一直在考虑将数据集拆分为较小的数据集,但后来我不知道如何检索数据集中行的索引信息。
我试过 scipy cdist、scipy euclidean、sklearn euclidean_distances、sklearnpaired_distances,下面的代码是我能得到的最快的。一开始它很快,但是在 40k 循环之后它变得非常慢。
xyTotal=np.random.random([5000000,6])
tol=0.5
for i,z in enumerate(xyTotal):
if (pdist(np.vstack([np.array(ng),z]))>tol).all():
ng.append(z)
对这个问题有什么建议吗?
编辑
ktree = BallTree(xyTotal, leaf_size=40,metric='euclidean')
btsem=[]
for i,j in enumerate(xyTotal):
ktree.query_radius(j.reshape(1,-1),r=tol, return_distance=True)
if (ktree.query_radius(j.reshape(1,-1),r=tol, count_only=True))==1:
btsem.append(j)
这很快,但我只挑选异常值。当我到达靠近另一个点(即在一个小集群中)时,我不知道只选择一个点并留下其他点,因为我将获得集群中所有点的相同指标(它们都有距离相同)
【问题讨论】:
标签: python numpy scikit-learn scipy