我需要一个很好的解决方案来总结成对的2d向量。
我想对point1和point2,point2和point3之间的距离求和...所以必须对所有对(取决于点的数量)完成
a = np.array([[1, 1],[0, 0],[7, 9]])
permutations = [((1, 1), (0, 0), (7, 9)), ((1, 1), (7, 9), (0, 0)), ((0, 0), (1, 1), (7, 9))] ....
现在,在创建所有可能的排列之后,我想对距离求和,以便指定总体上最短的顺序。 要获得到点之间的距离,我使用:
def calcDistance(a, b):
d = np.linalg.norm(a-b)
return d
但是我不知道如何将其应用于列表中以获取每对点的距离。我尝试使用for循环和切片。
for i in range(0, len(permutations), 3):
print(permutations[i:i+3])
作为一个测试它有效,但是我不知道如何在列表中的每对上应用calc函数并将其求和再求和以获得总距离。 排列都存储在一个列表中,所以我的想法是每次迭代遍历n个元素(点/向量的数量)。
答案 0 :(得分:1)
对于3点数组来说不太好用,但是einsum计算对于计算长度/距离很有用。在这种情况下,只需使用输入坐标序列和以前建议的创建点单的方式
import itertools
a = np.array([[1, 1],[0, 0],[7, 9]])
p0 = np.asarray(list(itertools.permutations(a, 3)))
def _cal(a):
"""Perform the calculation, mini-e_leng."""
diff = a[:-1] - a[1:]
return np.nansum(np.sqrt(np.einsum('ij,ij->i', diff, diff)))
[_cal(i) for i in p0]
[12.815967813364475,
21.40175425099138,
11.414213562373096,
21.40175425099138,
11.414213562373096,
12.815967813364475]
答案 1 :(得分:0)
您可以使用max
查找每个相邻成员对中差异最大的一个。另外,您可以使用itertools
生成排列:
import itertools
import numpy as np
a = [(1, 1),(0, 0),(7, 9)]
permutations = tuple(itertools.combinations(a,3))
print(permutations)
def calcDistance(a, b):
d = np.linalg.norm(np.asarray(a)-np.asarray(b))
return d
most_dist_permutation = max(permutations, key=lambda x:calcDistance(*x[0:2])+calcDistance(*x[1:3]))
print(most_dist_permutation)
(((1, 1), (0, 0), (7, 9)), ((1, 1), (7, 9), (0, 0)), ((0, 0), (1, 1), (7, 9)), ((0, 0), (7, 9), (1, 1)), ((7, 9), (1, 1), (0, 0)), ((7, 9), (0, 0), (1, 1))) ((1, 1), (7, 9), (0, 0))
答案 2 :(得分:0)
运行:
m