Как суммировать пары двумерных массивов в списке - PullRequest
1 голос
/ 30 октября 2019

Мне нужно хорошее решение для суммирования пар 2d векторов.

Я хочу суммировать расстояние между точкой 1 и точкой 2, точкой 2 и точкой 3 ... Так что это должно быть сделано со всеми парами (в зависимости отна количество точек)

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-элементам (количеству точек / векторов) для каждой итерации.

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Не очень элегантно для 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]
0 голосов
/ 30 октября 2019

Пробег:

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])]
0 голосов
/ 30 октября 2019

Вы можете использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...