让我说我有两个点阵列,我想知道每个点之间的距离是什么。
例如:
array_1 = [p1,p2,p3,p4]
array_2 = [p5,p6]
p1到p6是点,类似于[1,1,1](3D)
我想要的输出是
output = [[distance of p1 to p5, distance of p2 to p5, ... distance of p4 to p5],
[distance of p1 to p6, distance of p2 to p6, ... distance of p4 to p6]]
如果我想使用numpy,什么是最好的方法?
答案 0 :(得分:2)
此答案并非专门针对numpy数组,但可以轻松扩展为包括它们。模块itertools.product是您的朋友。
# Fill this with your formula for distance
def calculate_distance(point_1, point_2):
distance = ...
return distance
# The itertools module helps here
import itertools
array_1, array_2 = [p1, p2, p3, p4], [p5, p6]
# Initialise list to store answers
distances = []
# Iterate over every combination and calculate distance
for i, j in itertools.product(array_1, array_2):
distances.append(calculate_distance(i, j)
答案 1 :(得分:2)
您可以先将两个数组排列为 m×1×3 和 1×n×3 形状,然后减去坐标:
delta = array_1[:,None] - array_2
接下来,我们可以对坐标中的差异求平方,然后计算总和,然后我们就可以计算出平方律:
distances = np.sqrt((delta*delta).sum(axis=2))
现在distances
是一个 m×n 矩阵,其第 i 个元素之间的距离为 ij 个元素第一个数组的元素,第二个数组的 j 个元素。
例如,如果我们有数据:
>>> array_1 = np.arange(12).reshape(-1,3)
>>> array_2 = 2*np.arange(6).reshape(-1,3)
我们得到的结果是
>>> delta = array_1[:,None] - array_2
>>> distances = np.sqrt((delta*delta).sum(axis=2))
>>> distances
array([[ 2.23606798, 12.20655562],
[ 3.74165739, 7.07106781],
[ 8.77496439, 2.23606798],
[13.92838828, 3.74165739]])
array_1
的第一个元素的坐标为(0,1,2),array_2
的第二个元素的坐标为(6,8,10)。因此,距离为:
>>> np.sqrt(6*6 + 7*7 + 8*8)
12.206555615733702
这是我们在distances
的{{1}}数组中看到的。
上述函数方法可以计算任意数量尺寸的 Euclidean 距离。假设distances[0,1]
和array_1
都具有尺寸相同的点(1D,2D,3D等),则可以计算这些点的距离。