8
votes

Python en cours de course cumulative avec une fenêtre donnée

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.

Par exemple, étant donné un tableau [1,2,3,4,5,6,7,8,9,10,11,12] 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] . J'ai une matrice incorporelle relativement importante et aimerais faire une somme cumulative avec une fenêtre de 400.


1 commentaires

Dupliqué possible de MOYEN MOYENNE MOYENNE MOYENNE


4 Réponses :


3
votes
[(sum(lis[:i+1]),sum(lis[i-(w-1):i+1]))[i>(w-1)]  for i in range(len(lis))]

10 commentaires

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


@larsvegas accumulez () 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 Vous obtenez?


@Ashwini Chaudhary, eh bien, il utilise numpy donc numpy.cumsum () est la voie à suivre. Ou simplement définir votre fonction Cumsum.


@Ashwinichaudhary fichier "", ligne 1 feneedculofi = [somme (OFIS [I- (W-1): i + 1]) Si je> (W-1) SUME (OFI [: I +1] pour i in gamme (len (OFIS))] ^ SyntaxError: syntaxe non valide merci même que je viens de faire une boucle normale au lieu d'une compréhension de la liste et que cela a fonctionné. L'erreur se produit. L'erreur se produit à l'if


Il s'appelle une compréhension de liste .


@ 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))] est un nombre de bits que d'utiliser cette construction ternaire .



8
votes

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 stride_tricks code> (ce ne sont pas évidents, mais résolvez ces choses bien).

Par exemple, étant donné une fonction comme ceci (vous pouvez trouver plus de versions plus ampeneuses): p> xxx pré>

vous pouvez faire: p>

np.convolve(array, np.ones(400), mode='valid')


0 commentaires

1
votes

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)


0 commentaires

33
votes

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


4 commentaires

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 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] ? Toute raison de l'utilisation de A.Cumsum () [: - 3] au lieu de B [: - 3] ?


@FroZenFlame, vous avez raison, aussi loin que je peux voir, B [3:] = b [3:] - B [: - 3] fonctionne bien. Cependant, regarder, b [3:] - = b [: - 3] ne fonctionne pas car il modifie des éléments avant leur lecture.