【发布时间】:2016-02-26 19:13:18
【问题描述】:
我有几个 (~10^10) 点的 x、y、z 坐标数组(此处仅显示 5 个)
a= [[ 34.45 14.13 2.17]
[ 32.38 24.43 23.12]
[ 33.19 3.28 39.02]
[ 36.34 27.17 31.61]
[ 37.81 29.17 29.94]]
我想创建一个新数组,其中仅包含与列表中所有其他点至少有一定距离d 的那些点。我用while循环写了一段代码,
import numpy as np
from scipy.spatial import distance
d=0.1 #or some distance
i=0
selected_points=[]
while i < len(a):
interdist=[]
j=i+1
while j<len(a):
interdist.append(distance.euclidean(a[i],a[j]))
j+=1
if all(dis >= d for dis in interdist):
np.array(selected_points.append(a[i]))
i+=1
这可行,但执行此计算需要很长时间。我在某处读到while 循环非常慢。
我想知道是否有人对如何加快计算速度有任何建议。
编辑:虽然我找到与所有其他粒子至少有一定距离的粒子的目标保持不变,但我刚刚意识到我的代码存在严重缺陷,假设我有3个粒子,我的代码执行以下操作,对于i的第一次迭代,它计算距离1->2,1->3,假设1->2小于阈值距离d,所以代码抛出远离粒子1。对于i的下一次迭代,它只做2->3,假设它发现它大于d,所以它保持粒子2,但这是错误的!因为 2 也应该与粒子 1 一起丢弃。 @svohara 的解决方案是正确的!
【问题讨论】:
-
需要多长时间?
-
我跑了一夜~7个小时,它还在运行。
-
作为一个快速建议,如果距离大于
d,您可能不会继续计算距离。它将减少子句all(dis >= d for dis in interdist)中的另一个遍历数组 -
你能提供一个功能脚本吗?你的
halos和selected_halos没有定义 -
抱歉,我的想法不完整,但我记得不久前读过一种使用三角不等式来减少所需计算次数的 k-means 聚类方法(也需要欧几里得距离计算)
标签: python python-2.7 numpy while-loop