0
votes

Somme des entrées spécifiques dans la matrice avec numpy

Je voudrais votre aide pour le problème suivant.

J'ai une matrice de contiguïté comme tableau numpy:

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

Ensuite, je veux additionner les poids des arêtes entre la liste des nœuds, par exemple:

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

Comment puis-je faire ça?

Merci d'avance!


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser numpy.ix_ pour obtenir la pièce appropriée du tableau et calculez la somme.

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)


0 commentaires

0
votes

Vous pouvez essayer ceci:

1
9
13

Résultat:

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


0 commentaires

0
votes

Que diriez-vous d'utiliser des outils intégrés et un peu de découpage?

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

Attention: cela ne prend que le premier et le dernier élément de la liste passée et additionne les éléments entre eux.

Inspiré par cette réponse .


0 commentaires