如何计算列表中点之间的距离?

3

我有两个列表组,A和O。它们都有来自x、y、z坐标的点。我想计算来自A和B的点之间的距离。我使用了一个for循环,但它只给出了一个结果。它应该给我8个数字的结果。如果有人能看一下,我将不胜感激。这是我项目中的最后一步。

Ax = [-232.34, -233.1, -232.44, -233.02, -232.47, -232.17, -232.6, -232.29, -231.65] 
Ay = [-48.48, -49.48, -50.81, -51.42, -51.95, -52.25, -52.83, -53.63, -53.24] 
Az = [-260.77, -253.6, -250.25, -248.88, -248.06, -247.59, -245.82, -243.98, -243.76]
Ox = [-302.07, -302.13, -303.13, -302.69, -303.03, -302.55, -302.6, -302.46, -302.59] 
Oy = [-1.73, -3.37, -4.92, -4.85, -5.61, -5.2, -5.91, -6.41, -7.4] 
Oz = [-280.1, -273.02, -269.74, -268.32, -267.45, -267.22, -266.01, -264.79, -264.96]
distance = []
for xa in A1:
    for ya in A2:
        for za in A3:
            for x1 in o1:
                for y1 in o2:
                    for z1 in o3:
                        distance += distance
                        distance = (((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2)  
print(distance)
5个回答

3

其他人已经提供了解决你问题的办法。我也建议你开始使用numpy,避免使用所有的for循环。Numpy提供了向量化代码的方法,基本上将所有需要进行的循环转移到非常高效的C++实现中。例如,你可以用下面的向量化实现来替换你整个嵌套的循环:

import numpy as np

# Convert your arrays to numpy arrays
Ax = np.asarray(Ax)
Ay = np.asarray(Ay)
Az = np.asarray(Az)
Ox = np.asarray(Ox)
Oy = np.asarray(Oy)
Oz = np.asarray(Oz)
# Find the distance in a single, vectorized operation
np.sqrt(np.sum(((Ax-Ox)**2, (Ay-Oy)**2, (Az-Oz)**2), axis=0))

2
您的第一个问题是:

distance = (((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2)

尽管您将距离定义为列表,但您仍在用单个值替换值列表。您需要的是:
distance.append((((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2))

这将把这个值添加到列表的末尾。

第二件事:你的工作流程可以改进。不要使用那么多的for循环,尝试这样做:你知道A1A2A3o1o2o3的长度是相同的,因此:

distance = []
for i in range(len(A1)): # will run 8 times because the length of A1 is 8
    xa, ya, za = A1[i], A2[i], A3[i] # these values correspond to each other
    xb, yb, zb = o1[i], o2[i], o3[i] # all are in the same position in their respective list
    distance.append((((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2))
print distance

1
通过嵌套所有这些循环,您将在“父循环”的每次迭代中执行每个“子循环”,以此类推,导致比必要的更多的循环和一些混乱的数据。正如其他答案所提到的,您还会在每次传递时重新分配distance到最内层循环的最后一个计算值。
您可以通过zip压缩数据来更高效地完成所有这些操作。
distance = []
for ptA, ptB in zip(zip(Ax, Ay, Az), zip(Ox, Oy, Oz)):
    distance.append(pow(sum(pow(a - b, 2) for a, b in zip(ptA, ptB)), 0.5))

1
你的嵌套循环不仅效率低下,而且是错误的。你正在遍历每个点集的x、y和z值的所有组合。
以下是用列表推导式完成任务的方法:
distance = [((xa-x1)**2 + (ya-y1)**2 + (za-z1)**2)**(0.5)
            for (xa, ya, za, x1, y1, z1) in zip(Ax, Ay, Az, Ox, Oy, Oz)]

zip 函数生成相应坐标值的组。然后将它们解压缩为给定一对点的各个值。接着计算距离并添加到结果列表中。以下是结果:

[86.14803712215387, 85.25496701072612, 86.50334270997855, 86.02666679582558, 86.61455593605497, 86.90445212991106, 86.65519315078585, 87.10116761559514, 87.08173861378742]

请注意,您公式中的(1/2)适用于Python 3,但不适用于Python 2。我已经使用了0.5,这将适用于两者。使用math.sqrt()可能是更好的选择。

1
您需要将距离添加到distance列表中,而不是赋值给它。在您的for循环内应该这样做: distance.append((((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2))

我根据你的代码进行了修改,但是Jupyter显示:“IOPub数据速率超过限制。笔记本服务器将暂时停止向客户端发送输出以避免崩溃。要更改此限制,请设置配置变量--NotebookApp.iopub_data_rate_limit。当前值: NotebookApp.iopub_data_rate_limit=1000000.0(字节/秒) NotebookApp.rate_limit_window=3.0(秒)" - Ben Wang
这是什么意思? - Ben Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接