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!
3 Réponses :
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)
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]))
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 .