用numpy对矩阵中的特定项求和

2024-09-30 10:41:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望你能帮我解决下一个问题

我有一个邻接矩阵作为numpy数组:

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

我该怎么做

提前感谢


Tags: ofnumpyonly列表节点np数组between
3条回答

使用一些车载工具和一些切片怎么样

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()

小心:这只取传递的列表的第一个和最后一个元素,并对它们之间的元素求和

灵感来自this answer

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

您可以尝试以下方法:

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

相关问题 更多 >

    热门问题