python - 在两个点数组上循环

标签 python arrays performance for-loop euclidean-distance

我有两个点数组:list1list1.shape = [N, 3] 以及 list2list2。形状 = [M, 3]N, M内:点的总数,(x, y, z)是3维坐标。

现在我想检查 list1 的每个点与 list2 的每个点是否在 r 的距离内。执行此操作的自然方法是 for 循环:

for i in range(N):
    for j in range(M):
        if (list1[i, 0] - list2[j, 0])**2 + (list1[i, 1] - list2[j, 1])**2 + (list1[i, 2] - list2[j, 2])**2 < r**2:
        ''' Return 1 if list1[i] is within list2[j] '''
            return True
        else:
        ''' Return 0 if list1[i] is not within list2[j] '''
            return False

但是速度太慢了。我可以采用更有效的方法吗?

最佳答案

您可以使用外部操作来计算没有 for 循环的距离矩阵:

s = np.subtract.outer

d_matrix = s(list1[:,0], list2[:,0])**2
d_matrix += s(list1[:,1], list2[:,1])**2
d_matrix += s(list1[:,2], list2[:,2])**2

其中每条线是点 i 到所有点的距离。要使用您的标准找出点 i 是否接近任何点:

a = np.zeros_like(list1[:,0])
a[np.any(d_matrix < r**2, axis=1)] = 1

关于python - 在两个点数组上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22328735/

相关文章:

python - 无法使用 Django manage.py 创建 super 用户

python - 如何使类 JSON 可序列化以在 Django session 中使用

performance - 对于大于 32kb 的文件,BLOB 导出速度很慢

webserver - "ab"还是 "httperf"更适合检查网站的性能?

C++:返回 C 字符串的最快方法

python - Pandas 。将值与其他 DataFrame 中的相应范围进行匹配

python - 获取文本边界框,独立于后端

java - 在 Java 中连接多维数组的最佳方法是什么?

java - 将 scala 列表转换为 <repeated...>

php - 检查数组元素是否对称