我有两组列表,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)
答案 0 :(得分:2)
您的第一个问题是这个
距离=(((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
循环,请尝试这样做:您知道 A1
, A2
, A3
, o1
, o2
和 o3
的长度相同,因此:
距离= []
对于范围(len(A1))中的i:#将运行8次,因为A1的长度为8
xa,ya,za = A1 [i],A2 [i],A3 [i]#这些值彼此对应
xb,yb,zb = o1 [i],o2 [i],o3 [i]#在各自的列表中都位于相同的位置
distance.append(((((xa-x1)** 2)+((ya-y1)** 2)+((za-z1)** 2))**(1/2))
打印距离
答案 1 :(得分:2)
其他人已解决您的紧急问题。我还建议您开始使用numpy
,并避免所有这些for
循环。 Numpy提供了使代码矢量化的方法,基本上可以将非常高效的C ++实现所需的所有循环工作卸载。例如,您可以使用以下矢量化实现替换整个嵌套的for循环事物:
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 :(得分:1)
您需要追加距离,但未分配距离。您应该在for循环中执行以下操作:
distance.append((((xa-x1)**2)+((ya-y1)**2)+((za-z1)**2))**(1/2))
答案 3 :(得分: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))
答案 4 :(得分: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,但不适用于Python2。我使用了0.5
,这对两者均适用。使用math.sqrt()
可能是一个更好的主意。