Sie fragen nach einem einfachen IIR-Filter . Scipys lfilter () ist dafür gemacht:
%Vor% Wenn du nur mit einem 1D-Array arbeitest, dann brauchst du nur wenig scipy oder schreibe ein benutzerdefiniertes Kommando, um ufunc für numpy zu reduzieren. In Python 3.3+ kannst du itertools.accumulate
verwenden, zB:
Ich denke nicht, dass dies in NumPy alleine leicht gemacht werden kann, ohne eine Schleife zu benutzen.
Eine arraybasierte Idee wäre die Berechnung der Matrix M_ij = .95 ** i * a [N-j] (wobei N die Anzahl der Elemente in a ist). Die Zahlen, nach denen Sie suchen, werden gefunden, indem Einträge diagonal summiert werden (mit i-j konstant). Sie könnten also mehrere numpy.diagonal(…).sum()
verwenden.
Der gute alte Algorithmus, den Sie skizzieren, ist klarer und wahrscheinlich schon ziemlich schnell (sonst können Sie Cython verwenden).
Was du mit NumPy ohne eine einzige Schleife machen willst, klingt für mich wie Zauberei. Hut ab vor jedem, der das durchziehen kann.
Numba bietet eine einfache Möglichkeit, vectorize
eine Funktion zu erstellen und ein < eine universelle Funktion "https://docs.scipy.org/doc/numpy/reference/ufuncs.html"> ( ufunc.accumulate
):