Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对列表中的二维数组对求和_Python_Numpy - Fatal编程技术网

Python 如何对列表中的二维数组对求和

Python 如何对列表中的二维数组对求和,python,numpy,Python,Numpy,我需要一个很好的解决方案来求二维向量对的和 我想求点1和点2,点2和点3之间的距离之和。。。因此,必须对所有对进行此操作(取决于点数) 现在,在创建了所有可能的排列之后,我想求距离的和,以便指定哪个顺序是最短的路径。 要获取到点之间的距离,我使用: def calcDistance(a, b): d = np.linalg.norm(a-b) return d 但我不知道如何在列表中应用它来获得每对点的距离。我试着用for循环和切片 for i in r

我需要一个很好的解决方案来求二维向量对的和

我想求点1和点2,点2和点3之间的距离之和。。。因此,必须对所有对进行此操作(取决于点数)

现在,在创建了所有可能的排列之后,我想求距离的和,以便指定哪个顺序是最短的路径。 要获取到点之间的距离,我使用:

    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个元素(点/向量的数量)。

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


对于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]

您在这里描述的是一个蛮力算法,用于查找图中两个顶点之间的最短路径。还有其他更有效的算法来做同样的事情。没错,但出于实践目的,我想(而且必须)用这种方法解决这个问题。不管它有多低效,我是numpy的noob,所以我可能会自己写循环,尽管几乎可以肯定有更好的方法用numpy魔术来做。祝你好运。但是我不知道如何写循环来解决这个积木求和的问题。试着解决一个小问题:给定一条路径作为一个元组,计算路径的长度。谢谢你的回答。我使用itertools进行如下排列:
permutations=list(itertools.permutations(points))
我不认为
max
是适合我的函数,我需要最短的路径。哦,太好了!很好地使用einsum。
(((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])]
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]