suppose que vous avez une gamme de valeurs qui devront être résumées ensemble et un second tableau spécifiant quels éléments doivent être résumés ensemble p> Le résultat sera stocké dans un nouveau tableau de taille J'ai essayé de mettre en œuvre cette utilisation en utilisant P> Cependant, le au lieu de p> Comment une implémente correctement ce genre de sommation? p> p> max (i) +1 code>. Donc, par exemple
i = [0,0,0,0,0] code> serait équivalent à la sommeil de tous les éléments de
d code> et de stocker le résultat en position
0 code> d'un nouveau tableau de taille
1 code>. p>
+ = code> L'opération ajoute chaque élément une seule fois, donnant ainsi le résultat inattendu de p>
5 Réponses :
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
Fermer, mais je pense que l'op veut pour didex, ridx en énumérant (i_list): résultat [RIDX] + = d [didex] code>. De plus, étant donné que les tags incluent [NUMPY], vous pouvez utiliser
numpy.zeros code>.
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 code>):
Si je comprends la question correctement, il existe une fonction rapide pour cela (tant que la matrice de données est 1D) np.bincount retourne un tableau pour toutes les gangs entièrement entiers (max (i)), même si certains comptes sont zéro p> p>
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, ...
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))
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
Ce serait beaucoup plus clair si les valeurs de
d code> étaient uniques. Par exemple, si
d = [0,1,2,3,4] code> i
m devine pour code> i = [0,0,0,0,0] `vous veux
c = [10] code>, tandis que pour
i = [0,0,1,2,2] code> vous voulez
c = [1,2,7] code>?
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.