Ce que je veux faire est de générer une matrice numpie qui est la somme cumulative d'un autre tableau numpy donné une certaine fenêtre. p>
Par exemple, étant donné un tableau [1,2,3,4,5,6,7,8,9,10,11,12] code> disons que je veux une somme cumulative avec un Fenêtre de 3. Ce que je veux, étant sortit serait
[1,3,6,9,12,15,18,21,24,27,30,33] code>. J'ai une matrice incorporelle relativement importante et aimerais faire une somme cumulative avec une fenêtre de 400. P>
4 Réponses :
[(sum(lis[:i+1]),sum(lis[i-(w-1):i+1]))[i>(w-1)] for i in range(len(lis))]
@ user1440194: Vous ne devriez plus utiliser Python 2.4. C'est ancien. Même 2,5 a atteint la fin de la vie et ne reçoit plus de mises à jour de sécurité.
@Ashwini Chaudhary, ne devriez-vous pas mieux utiliser itheroTools.accumblate () code>?
@larsvegas accumulez () code> est introduit dans Python 3.2, je suis sur Python 2.6 et OP utilise Python 2.4.
@ user1440194 Pouvez-vous poster la trace de SyntaxError Code> Vous obtenez?
@Ashwini Chaudhary, eh bien, il utilise numpy code> donc
numpy.cumsum () code> est la voie à suivre. Ou simplement définir votre fonction Cumsum.
@Ashwinichaudhary fichier "
Il s'appelle une compréhension de liste code>.
@ user1440194 Le problème est avec l'opérateur ternaire, Python 2.4 prend en charge un type d'opérateur ternaire différent. evanfosmark.com/2008/06/...
Vous pouvez probablement faire quelque chose comme celui-ci avec une combinaison de convolvols et de cumsum.
Je pense que [somme (lis [max (0, i-w + 1): i + 1]) pour i in gamme (len (lis))] code> est un nombre de bits que d'utiliser cette construction ternaire .
Vous devriez probablement utiliser des numéros, sauf si vous ne vous souciiez pas de la vitesse (bien que je préfère que ce soit de toute façon). Vous pouvez donc utiliser des approches basées sur convolvement ou Par exemple, étant donné une fonction comme ceci (vous pouvez trouver plus de versions plus ampeneuses): p> vous pouvez faire: p> stride_tricks code> (ce ne sont pas évidents, mais résolvez ces choses bien).
np.convolve(array, np.ones(400), mode='valid')
La réponse de Seberg est de meilleure et plus générale que la mienne, mais que vous devez avoir besoin de zéro-tamponnez vos échantillons pour obtenir le résultat que vous voulez.
import numpy as np from numpy.lib.stride_tricks import as_strided as ast samples = 100 window = 3 padding = np.zeros(window - 1) # zero-pad your samples a = np.concatenate([padding,np.arange(1,samples + 1)]) newshape = (len(a) - window,window) newstrides = a.strides * 2 # this gets you a sliding window of size 3, with a step of 1 strided = ast(a,shape = newshape,strides = newstrides) # get your moving sum strided.sum(1)
Voici peut-être une réponse plus simple, basée sur la soustraction de cumsums déplacés.
>>> a = np.array([1,2,3,4,5,6,7,8,9,10,11,12]) >>> b = a.cumsum() >>> b[3:] = b[3:] - b[:-3] >>> b array([ 1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33])
Pour les autres personnes qui peuvent lire ces réponses: c'est la façon canonique de le faire en numpopie, pour tout ce qu'il vaut. Si la vitesse compte, c'est beaucoup i> plus rapide que l'une des autres solutions. Vous faites fondamentalement beaucoup moins de calculs qui calculent explicitement la somme pour chaque fenêtre.
J'ai cherché des heures pour une solution comme celle-ci ... Autres réponses sur le débordement de la pile sont beaucoup plus élevées, mais c'est beaucoup plus rapide. En effet, la voie canonique numpie (elle enveloppe même le tableau d'origine!). Kudos à vous, monsieur.
La troisième ligne: que si j'écris b [3:] = b [3:] - B [: - 3] code>? Toute raison de l'utilisation de
A.Cumsum () [: - 3] code> au lieu de
B [: - 3] code>?
@FroZenFlame, vous avez raison, aussi loin que je peux voir, B [3:] = b [3:] - B [: - 3] code> fonctionne bien. Cependant, regarder,
b [3:] - = b [: - 3] code> ne fonctionne pas car il modifie des éléments avant leur lecture.
Dupliqué possible de MOYEN MOYENNE MOYENNE MOYENNE