Сумма, указанная c записей в матрице с numpy - PullRequest
0 голосов
/ 17 июня 2020

Мне нужна ваша помощь в решении следующей проблемы.

У меня есть матрица смежности как numpy array:

np.array([[ 0, 1, 2, 3],
          [ 1, 0, 6, 0],
          [ 2, 6, 0, 1],
          [ 3, 0, 1, 0]])

Затем я хочу суммировать веса ребер между список узлов, например:

sum_edeges_between_list([0,1]) = 1 # only one entry, matrix[0,1]
sum_edeges_between_list([0,1,2]) = 9 # sum of three entries, matrix[0,1] +  matrix[0,2] +  matrix[1,2]
sum_edeges_between_list([0,1,2,3]) = 13 # sum of all entries above main diagonal

Как я могу это сделать?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Вы можете попробовать это:

import numpy as np
from itertools import chain, combinations
def all_subsets(ss):
    return list(chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1))))

matx=np.array([[ 0, 1, 2, 3],
          [ 1, 0, 6, 0],
          [ 2, 6, 0, 1],
          [ 3, 0, 1, 0]])

def sum_edeges_between_list(ls):
    comb = [i for i in all_subsets(ls) if len(i)==2]
    return sum([matx[i[0]][i[1]] for i in comb])


print(sum_edeges_between_list([0,1]))
print(sum_edeges_between_list([0,1,2]))
print(sum_edeges_between_list([0,1,2,3]))

Вывод:

1
9
13
0 голосов
/ 17 июня 2020

Как насчет использования некоторых встроенных инструментов и небольшого нарезания?

import numpy as np

x = np.array([[ 0, 1, 2, 3],
              [ 1, 0, 6, 0],
              [ 2, 6, 0, 1],
              [ 3, 0, 1, 0]])

def sum_edeges_between_list(ics):

    # crop the elements using the upper-triangle function and slicing
    a = np.triu(x[ics[0]:(ics[-1] + 1), ics[0]:(ics[-1] + 1)], 0)

    return a.sum()

Осторожно: это берет только первый и последний элемент переданного списка и суммирует элементы между ними.

На основе этого ответа .

0 голосов
/ 17 июня 2020

Вы можете использовать numpy .ix_ , чтобы получить соответствующую часть массива и вычислить сумму.

import numpy as np
a = np.array([[ 0, 1, 2, 3],
          [ 1, 0, 6, 0],
          [ 2, 6, 0, 1],
          [ 3, 0, 1, 0]])


def sum_edges_between_list(a, L):
    """
    >>> sum_edges_between_list(a, [0,1])
    1
    >>> sum_edges_between_list(a, [0,1,2])
    9
    >>> sum_edges_between_list(a, [0,1,2,3])
    13
    """
    return (a[np.ix_(L, L)].sum() / 2).astype(a.dtype)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...