11
votes

Sommation cumulée d'une matrice numpue par index

suppose que vous avez une gamme de valeurs qui devront être résumées ensemble xxx

et un second tableau spécifiant quels éléments doivent être résumés ensemble xxx

Le résultat sera stocké dans un nouveau tableau de taille max (i) +1 . Donc, par exemple i = [0,0,0,0,0] serait équivalent à la sommeil de tous les éléments de d et de stocker le résultat en position 0 d'un nouveau tableau de taille 1 .

J'ai essayé de mettre en œuvre cette utilisation en utilisant xxx

Cependant, le + = L'opération ajoute chaque élément une seule fois, donnant ainsi le résultat inattendu de xxx

au lieu de xxx

Comment une implémente correctement ce genre de sommation?


3 commentaires

Ce serait beaucoup plus clair si les valeurs de d étaient uniques. Par exemple, si d = [0,1,2,3,4] i m devine pour i = [0,0,0,0,0] `vous veux c = [10] , tandis que pour i = [0,0,1,2,2] vous voulez c = [1,2,7] ?


C'est correct. Merci de clarifier.


Dans ce cas, la solution de JuxStaPose, avec le changement que je suggère dans les commentaires, devrait faire l'affaire.


5 Réponses :


2
votes
def zeros(ilen):
 r = []
 for i in range(0,ilen):
     r.append(0)

i_list = [0,0,1,2,2]
d = [1,1,1,1,1]
result = zeros(max(i_list)+1)

for index in i_list:
  result[index]+=d[index]

print result

1 commentaires

Fermer, mais je pense que l'op veut pour didex, ridx en énumérant (i_list): résultat [RIDX] + = d [didex] . De plus, étant donné que les tags incluent [NUMPY], vous pouvez utiliser numpy.zeros .



2
votes

Cette solution doit être plus efficace pour les grandes matrices (elle itière sur les valeurs d'index possibles au lieu des entrées individuelles de i ): xxx


0 commentaires

13
votes

Si je comprends la question correctement, il existe une fonction rapide pour cela (tant que la matrice de données est 1D) xxx

np.bincount retourne un tableau pour toutes les gangs entièrement entiers (max (i)), même si certains comptes sont zéro


1 commentaires

C'est la meilleure solution pour l'affaire décrite ici. Pour une somme générale de la matrice étiquetée, vous pouvez utiliser Scipire.ndimage.sum. Ces modules ont également d'autres fonctions utiles telles que maximum, minimum, moyenne, variance, ...



3
votes

Le commentaire de Juh_ est la solution la plus efficace. Voici le code de travail:

import numpy as np
import scipy.ndimage as ni

i = np.array([0,0,1,2,2])
d = np.array([0,1,2,3,4])

n_indices = i.max() + 1
print ni.sum(d, i, np.arange(n_indices))


0 commentaires

0
votes

Dans l'affaire Général Lorsque vous souhaitez que vous souhaitez résumer des sous-sources par des étiquettes, vous pouvez utiliser le code suivant

Wall time: 73.2 ms
Wall time: 68.9 ms
True


0 commentaires