繁体   English   中英

如何对列表中的二维 arrays 对求和

[英]How to sum pairs of 2d arrays in list

我需要一个很好的解决方案来总结成对的二维向量。

我想总结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 function 并再次总结以获得总距离。 排列都存储在一个列表中,所以我的想法是 go 在每次迭代的 n 元素(点/向量的数量)上。

对于 3 点 arrays 来说不是那么优雅,但 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]

您可以使用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))

跑:

import itertools
ss=list(itertools.permutations(np.arange(0,10), 2))

def calcDistance(a, b):
    d = np.linalg.norm(a-b)
    return d

[calcDistance(np.array(ss).T[0][i],np.array(ss).T[1][i]) for i in range(0,np.array(ss).shape[0])]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM