【问题标题】:Finding 3d distances using an inbuilt function in python使用python中的内置函数查找3d距离
【发布时间】:2013-12-09 16:51:07
【问题描述】:

我有 6 个列表存储两组位置的 x、y、z 坐标(每组 3 个列表)。我想计算两组中每个点之间的距离。我已经编写了自己的距离函数,但速度很慢。我的一个列表有大约 100 万个条目。 我试过 cdist,但它会产生一个距离矩阵,我不明白它是什么意思。是否有其他内置函数可以做到这一点?

【问题讨论】:

  • 能否请您展示一些示例输入和输出
  • 还有你的距离函数以及你正在解决的确切问题......笛卡尔3D空间中的距离函数非常简单:sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2),恐怕没有太多需要优化的地方。跨度>
  • One of my lists has about 1 million entries. 其他列表呢?如果它们具有相似的大小,大约是10^6 * 10^6 = 10^12 点对,恐怕即使是内置函数也会很慢。
  • 我建议你可以尝试编写一个 C 模块并在 Python 中调用它,或者完全使用 C 或 C++ 来进行计算。

标签: python list function distance


【解决方案1】:
# Use the distance function in Cartesian 3D space:
# Example
import math     
def distance(x1, y1, z1, x2, y2, z2):
d = 0.0
d = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
return d

【讨论】:

  • 如果可以的话,你当然会想要使用 NumPy 数组,因为列表对于这种类型的计算来说不是一个很好的数据结构。
【解决方案2】:

虽然此解决方案使用numpy,但np.linalg.norm 可能是另一种解决方案。

假设您有一个点 p0 = np.array([1,2,3]) 和第二个点 p1 = np.array([4,5,6])。那么找到两者之间距离的最快方法是:

dist = np.linalg.norm(p0 - p1)

【讨论】:

    【解决方案3】:

    如果可能,使用numpy 模块来处理这类事情。它比使用常规的 python 列表要高效得多。

    我是这样解释你的问题的

    1. 你有两组点
    2. 两组点数相同 (N)
    3. 集合 1 中的点 k 与集合 2 中的点 k 相关。如果每个点都是某个对象的坐标,我将其解释为包含初始点的集合 1 并将点设置为其他点时间t。
    4. 您想找到距离d(k) = dist(p1(k), p2(k)),其中p1(k) 是第1 组中的点号k,p2(k) 是第2 组中的点号k。

    假设你的6个列表分别是x1_coords、y1_coords、z1_coords和x2_coords、y2_coords、z2_coords,那么你可以这样计算距离

    import numpy as np
    p1 = np.array([x1_coords, y1_coords, z1_coords])
    p2 = np.array([x2_coords, y2_coords, z2_coords])
    
    squared_dist = np.sum((p1-p2)**2, axis=0)
    dist = np.sqrt(squared_dist)
    

    p1(k) 和 p2(k) 之间的距离现在以 dist[k] 的形式存储在 numpy 数组中。

    至于速度:在我的笔记本电脑上,配备“Intel(R) Core(TM) i7-3517U CPU @ 1.90GHz”,计算 N=1E6 的两组点之间的距离的时间为 45 毫秒。

    【讨论】:

    • 这没有回答原始问题。如果你无权访问 numpy 怎么办?
    • 如果你没有 NumPy,你可以这样做:stackoverflow.com/a/51665185/3585557。如果可以的话,你当然会想要使用 NumPy 数组,因为列表对于这种类型的计算来说不是一个很好的数据结构。
    猜你喜欢
    • 2014-07-18
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多