Thursday 22 June 2017

Numpy Verschieben Durchschnittliches Fenster

Hmmm, es scheint, diese quoteasy to implementquot Funktion ist eigentlich ziemlich einfach, falsch zu bekommen und hat eine gute Diskussion über Speicher-Effizienz gefördert. I39m glücklich, aufblasen zu haben, wenn es bedeutet, dass etwas nach rechts gemacht worden ist. Ndash Richard NumPys Mangel an einer bestimmten Domain-spezifische Funktion ist vielleicht aufgrund der Core Teams Disziplin und Treue zu NumPys Prime-Direktive: bieten einen N-dimensionalen Array-Typ. Sowie Funktionen zum Erstellen und Indizieren dieser Arrays. Wie viele grundlegende Ziele, diese ist nicht klein, und NumPy macht es brillant. Das (viel) grßere SciPy enthält eine viel grßere Sammlung von domänenspezifischen Bibliotheken (sogenannte Unterpakete von SciPy-Devs), beispielsweise numerische Optimierung (Optimierung), Signalverarbeitung (Signal) und Integralrechnung (integrieren). Meine Vermutung ist, dass die Funktion, die Sie nach ist in mindestens einem der SciPy-Unterpakete (scipy. signal vielleicht) aber ich würde zuerst in der Sammlung von SciPy Scikits suchen. Identifizieren die relevanten Scikit (s) und suchen die Funktion von Interesse dort. Scikits sind unabhängig voneinander entwickelte Pakete, die auf NumPy / SciPy basieren und auf eine bestimmte technische Disziplin gerichtet sind (z. B. scikits-image, scikits-learn etc.) Mehrere davon waren (insbesondere das geniale OpenOpt für numerische Optimierung) hoch angesehen, reif Projekte lange vor der Wahl, um unter der relativ neuen Scikits Rubrik wohnen. Auf der Homepage der Scikits sind über 30 solcher Scikits aufgelistet. Obwohl mindestens einige von ihnen nicht mehr unter aktiver Entwicklung sind. Nach diesem Rat würden Sie zu scikits-timeseries führen, aber das Paket ist nicht mehr unter aktiver Entwicklung In Wirklichkeit ist Pandas geworden, AFAIK, die de facto NumPy-basierte Zeitreihen-Bibliothek. Pandas hat mehrere Funktionen, die verwendet werden können, um einen gleitenden Durchschnitt zu berechnen, der einfachste ist wahrscheinlich rollingmean. Die Sie so verwenden: Nun, rufen Sie einfach die Funktion Rolling Mean Passing in der Serie Objekt und eine Fenstergröße. Die in meinem Beispiel unten ist 10 Tage. Ob es funktioniert hat - z. Verglichen Werte 10-15 in der ursprünglichen Serie gegenüber der neuen Serie geglättet mit rollenden Mittel Die Funktion Rolling Mean, zusammen mit etwa ein Dutzend oder so andere Funktion sind informell gruppiert in der Pandas-Dokumentation unter der Rubrik Moving-Fenster-Funktionen eine zweite, verwandte Gruppe von Funktionen In Pandas wird als exponentiell gewichtete Funktionen bezeichnet (zB ewma, die einen exponentiell verschobenen gewichteten Durchschnitt berechnet). Die Tatsache, dass diese zweite Gruppe nicht in den ersten (bewegten Fensterfunktionen) enthalten ist, liegt vielleicht daran, dass die exponentiell gewichteten Transformationen sich nicht auf ein Fenster mit fester Länge verlassen. Im ersten Schritt wird ein Graph dargestellt, der die Mittelwerte von zwei Arrays zeigt. Let8217s erstellen zwei Arrays x und y und zeichnen sie. X wird 1 bis 10 sein. Und y haben die gleichen Elemente in einer zufälligen Reihenfolge. Dies wird uns helfen zu überprüfen, dass tatsächlich unser Durchschnitt korrekt ist. Let8217s berechnen die Ordnung unserer Elemente in y noch einmal und zeichnen sich wieder: In Bezug auf y sehen wir, wie sich der gleitende Durchschnitt verhält: Im nächsten Tutorial werden wir die gleitenden Mittelwerte darstellen. Share this: Gefällt mir: Verwandte Post navigation Lassen Sie eine Antwort Abbrechen Antwort d bloggers wie folgt: Wir haben vorgestellt, wie man gleitende Durchschnitte mit Python erstellen. Dieses Tutorial wird eine Fortsetzung dieses Themas sein. Ein gleitender Durchschnitt im Rahmen von Statistiken, auch Rolling / Run Average genannt, ist eine Art von endlicher Impulsantwort. In unserem vorherigen Tutorial haben wir die Werte der Arrays x und y: Let8217s plot x gegen den gleitenden Durchschnitt von y aufgetragen, den wir yMA nennen wollen: Erstens, let8217s gleichen die Länge beider Arrays aus: Und dies im Kontext: Das Ergebnis Diagramm: Um zu verstehen, dies, let8217s plot zwei verschiedene Beziehungen: x vs y und x vs MAy: Der gleitende Durchschnitt hier ist das grüne Diagramm, das bei 3 beginnt: Share this: So verwandte Post navigation Lassen Sie eine Antwort Antworten abbrechen Sehr nützlich Ich möchte den letzten Teil auf großen Datensätzen lesen Hope wird es bald kommen8230 d Blogger wie folgt: In meinem letzten Satz war ich versuchen zu zeigen, warum es Gleitkomma-Fehler hilft. Wenn zwei Werte annähernd dieselbe Größenordnung sind, dann verliert das Addieren weniger Genauigkeit, als wenn Sie eine sehr große Zahl zu einem sehr kleinen hinzugefügt haben. Der Code kombiniert quadratweise benachbarte Quotwerte in einer Weise, daß gerade Zwischensummen immer in der Grße ausreichend nahe sein sollten, um den Gleitkommafehler zu minimieren. Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespart. Ndash Mayur Patel Dez 15 14 am 17:22 Alleo: Statt einer Addition pro Wert, you39ll tun zwei. Der Beweis ist der gleiche wie das Bit-Flipping-Problem. Allerdings ist der Punkt dieser Antwort nicht notwendigerweise Leistung, sondern Präzision. Die Speicherauslastung für die Mittelung von 64-Bit-Werten würde 64 Elemente im Cache nicht überschreiten, daher ist sie auch im Arbeitsspeicher freundlich. Ndash Mayur Patel UPD: effizientere Lösungen wurden von Alleo und jasaarim vorgeschlagen. Sie können np. convolve dafür verwenden: Das Argument mode gibt an, wie die Kanten behandelt werden sollen. Ich wählte den gültigen Modus hier, weil ich denke, das ist, wie die meisten Leute erwarten, laufen zu arbeiten, aber Sie können andere Prioritäten haben. Hier ist ein Diagramm, das den Unterschied zwischen den Modi veranschaulicht: Sie können einen laufenden Mittelwert mit berechnen: Glücklicherweise enthält numpy eine Faltungsfunktion, die wir verwenden können, um die Dinge zu beschleunigen. Der laufende Mittelwert entspricht dem Falten von x mit einem Vektor, der N lang ist, wobei alle Elemente gleich 1 / N sind. Die numpy-Implementierung von convolve beinhaltet den Start-Transient, also müssen Sie die ersten N-1 Punkte entfernen: Auf meiner Maschine ist die schnelle Version 20-30 mal schneller, abhängig von der Länge des Eingabevektors und der Größe des Mittelungsfensters . Beachten Sie, dass Convolve enthält einen gleichen Modus, der scheint, wie es die vorübergehende Frage ansprechen sollte, aber es teilt es zwischen Anfang und Ende. Es entfernt den Übergang vom Ende, und der Anfang doesn39t haben eine. Nun, ich denke, es ist eine Frage der Prioritäten, ich don39t brauchen die gleiche Anzahl von Ergebnissen auf Kosten der eine Steigung in Richtung Null, die isn39t gibt es in den Daten. BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi: Modi (39full39, 39same39, 39valid39) Diagramm (convolve (one ((200,)), diejenigen ((50,)) 4750, Modem) für m in Modi zu zeigen Achse (-10, 251, -.1, 1.1) Legende (Modi, loc39Lower center39) (mit pyplot und numpy importiert). Ich bin immer von Signalverarbeitung geärgert, die Ausgangssignale von anderer Form zurückgeben als die Eingangssignale, wenn beide Eingänge und Ausgänge von gleicher Natur sind (z. B. beide Zeitsignale). Es bricht die Korrespondenz mit der zugehörigen unabhängigen Variablen (z. B. Zeit, Frequenz), die Plotten oder Vergleichen nicht direkt macht. Wenn Sie das Gefühl teilen, können Sie die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve (w / w. sum (), s, mode39same39) zurückgeben ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Lapis ja, aber lassen Sie uns sagen, Sie verwenden Cumsum-Methode auf die erste Tick und speichern Sie Ihre rollende durchschnittliche Array für das nächste Häkchen. Jeder Tick danach müssen Sie nur die neuesten gleitenden Mittelwert an Ihre rollende Array im Speicher anhängen. Mit dieser Methode können Sie nicht neu berechnen Dinge, die Sie bereits berechnet haben: Am ersten ticken Sie cumsum danach fügen Sie nur das quotmean der letzten Periode elementsquot, die 2x schneller für alle nachfolgenden Zecken ist. ndash litepresence 10. Juni um 12: 29Suggestion: Schiebefenster Funktion 7753 np. lib. stridetricks. asstride eine Verwendung sehr effizient ein Schiebefenster, die Segmente ein Array als Vorverarbeitungsschritt für vektorisiert Anwendungen zu erstellen. Zum Beispiel ein gleitender Durchschnitt einer Fensterlänge 3. Schrittweite 1: Dies ist sehr performant, aber sehr schwer zu tun, da die Form und Schritten Parameter sind sehr schwer zu verstehen. Ich schlage vor, die Umsetzung einer einfachen Schiebefenster-Funktion, die den Job der Berechnung dieser beiden Parameter für Sie macht. Beide machen es viel besser lesbar. Sehen es ist ein gemeinsames usecase in vektorisiert Computing Ich schlage vor, wir eine ähnliche Funktion in NumPy setzen sich. In Bezug auf die die Umsetzung zu folgen, sie sind beide unterschiedliche Dinge assume sondern ermöglicht es Ihnen, das Gleiche zu tun, schließlich: gleitet über eine Achse Fenstergröße und Schrittgrßenregister kehrt Array mit Dimension kostenlos n1 Gleiten über mehrere Achsen erfordert zwei Anrufe (die kommen erlaubt nur Einstellung da es keinen Speicher neu geordnet ist) eine überflüssige Kopie Parameter hat, die entfernt und ersetzt werden kann durch Anfügen. copy () nach dem Aufruf gleitet über alle Achsen gleichzeitig werden Fensterlängen angegeben als Tupel Parameter eine Schrittgrßenregister ein in alle Richtungen Geht davon liefert Array mit Dimension n2 Schrittgrßenregister nicht gleich eins erfordert Schneiden von Ausgangsdaten (nicht sicher, ob dies das Kopieren von Daten impliziert) über axisn Deaktivieren Schiebe erfordert, dass Sie Argument gesetzt wshapen 1 oder wshapen a. shapen diese für flexible Schrittgrßenregister bedeutet folgendes äquivalent sind (mit etwas kleinere Fehler in slidingwindow dort): zum Gleiten über eine Achse der folgenden äquivalent sind (mit etwas Transponieren und Quetschen): und über zwei Achsen der folgenden für Schiebe sind äquivalent: Dieses Problem ist Diskussion über Do über Funken brauchen wir eine solche Funktion, die Funktionen, die erforderlich sind Schnittstelle sollten wir fortsetzen Nach der Diskussion bin ich bereit, eine Pull-Anforderung mit einer Implementierung zu erarbeiten, die wir vereinbart haben. Während immer ein Schiebefenster mit Schritt Tricks ist sehr cool, wobei fast jede Funktion durch Vektorisierung oben auf, die ineffizient ist. Ich bin nicht sicher, es ist eine gute Idee, eine Funktion zur Verfügung zu stellen, dass die Menschen diesen Weg zu gehen ermutigt, wenn es Funktionalität in Pandas, Engpass und scipy. ndimage, die die typischen Anwendungsfälle effizient implementiert. Jaime Am Freitag, 17. Juni 2016, um 1:29 Uhr, Nils Werner. gt schrieb: np. lib. stridetricks. asstride eine Verwendung sehr effizient ein Schiebefenster, die Segmente ein Array als Vorverarbeitungsschritt für vektorisiert Anwendungen zu erstellen. Zum Beispiel ein gleitender Durchschnitt einer Fensterlänge 3, Schrittgröße 1: eine numpy. arange (10) astrided numpy. lib. stridetricks. asstrided (a, Form (8, 3), schreitet (8, 8)) print numpy. mean (Astrided, axis1) Dies ist sehr performant, aber sehr schwer zu tun, da die Form und Schritten Parameter sind sehr schwer zu verstehen. Ich schlage vor, die Umsetzung einer einfachen Schiebefenster-Funktion, die den Job der Berechnung dieser beiden Parameter für Sie macht. Die Umsetzung ich seit Jahren ltgist. github / nils-werner / 9d321441006b112a4b116a8387c2280c gt verwendet haben ermöglicht die oben durch eine numpy. arange (10) astrided slidingwindow (a, size3, stepsize1) print numpy. mean (astrided, axis1) ersetzt werden teoliphant ltgithub / teoliphant gt hat auch eine Implementierung ltgist. github / teoliphant / 96eb779a16bd038e374f2703da62f06d gt, dass die oben auf einem numpy. arange (10) astrided arrayforslidingwindow (a, 3) Druck numpy. mean (astrided, axis1) beide es viel machen würde sich ändern mehr lesbar. Sehen es ist ein gemeinsames usecase in vektorisiert Computing Ich schlage vor, wir eine ähnliche Funktion in NumPy setzen sich. gleitet über nur eine Achse - - erlaubt die Einstellung Fenstergröße und Schrittweite - slidingwindow Gleiten über mehrere Achsen erfordert zwei Anrufe (die kostenlos kommen wie: schließlich in Bezug auf die die Umsetzung zu folgen, sind sie beide unterschiedliche Dinge annehmen, sondern ermöglicht es Ihnen, das Gleiche zu tun gibt es keinen Speicher neu geordnet) - hat eine überflüssige Kopie Parameter, der durch Anfügen. copy () nach dem Aufruf arrayforslidingwindow entfernt und ersetzt werden können - gleitet über alle Achsen gleichzeitig, Fensterlängen als Tupel Parameter angegeben werden - Vorausgesetzt wird ein Schrittgrßenregister ein in alle Richtungen - Schrittgrßenregister nicht gleich eins erfordert Schneiden von Ausgangsdaten (nicht sicher, ob dies das Kopieren von Daten impliziert) - Deaktivieren über axisn Schiebe erfordert, dass Sie Argument gesetzt wshapen a. shapen das bedeutet für flexible Schrittgrßenregister folgende gleichwertig sind (mit etwas kleinere Fehler in slidingwindow dort) : a numpy. arange (10) Druck slidingwindow (a, size3, stepsize2) ein numpy. arange (10) Druck arrayforslidingwindow (a, 3) :: 2. Schrittgrßenregister 2 durch jede 2. Reihe zum Gleiten über eine Achse der folgenden äquivalent fallen (mit etwas Transponieren): a numpy. arange (25).reshape (5, 5) print slidingwindow (a, size3, axis1) ein numpy. arange ( 25).reshape (5, 5) print arrayforslidingwindow (a, (5, 3)) und zum Gleiten über zwei Achsen der folgenden äquivalent: ein numpy. arange (25).reshape (5, 5) print slidingwindow (slidingwindow ( a, size3, axis0), size2, axis1) ein numpy. arange (25).reshape (5, 5) print arrayforslidingwindow (a, (3, 2)) Dieses Problem ist etwa Diskussion Funken über - Haben wir eine solche Funktion benötigen - Welche Funktionen benötigt werden - Welche Schnittstelle sollten wir nach Diskussion persue ich bin bereit, eine Pull-Anforderung mit einer Implementierung wir vereinbart auszuarbeiten oben. Sie erhalten diese, weil Sie dieses Thema abonniert werden. Antworten Sie auf diese E-Mail direkt, sehen sie auf GitHub lt7753 gt, oder schalten Sie den Faden ltgithub / Meldungen / Abmelden / ADMGdnU4Geecqxo3EP7gTFhkKQF8ovzeks5qMoU1gaJpZM4I4RX9 gt. - (/) (O. o) (gt lt) Este es Conejo. Copia a Conejo en tu firma und aydale en sus Flugzeuge de dominacin mundial. Das Beispiel war offensichtlich nur gewählt, um das Beispiel so klein wie möglich zu halten. Ich bin nicht sicher, ob ich verstehe, warum fast jede Funktion auf, dass es ineffizient wäre. Ein weiteres Beispiel, das Berechnen des Spektrogramms eines Signals, wobei das Schiebefenster gt2x schneller als eine for-Schleife ist (plus die gleitende Fenster-Implementierung ist leichter zu lesen und zu debuggen): Sein nicht das gleiche wie Ihr Beispiel, aber sagen, Sie haben ein Array mit N Elemente und Sie wollen FFTs der Größe m auf einem Schiebefenster darüber ausführen. Die Komplexität Ihrer Operationen wird O (n m log m) sein. Aber, sobald Sie die erste FFT zu berechnen, müssen Sie nicht alle Berechnungen wiederholen. Sagen Sie x ist Ihr ursprüngliches Array und y die FFT für ein bestimmtes gleitendes Fenster, und z für das gleitende Fenster ein Schritt der Größe eins weiter. Abgesehen von dem Multiple-Off von einem Fehler, den ich wahrscheinlich mache, könnte man so etwas tun: yk sum (xi exp (-2 pi 1j ki / m für i im Bereich (0, m)) zk sum (xi exp (-2 Pi 1j k (i - 1) / m für i im Bereich (1, m1)) zk (yk - x0 xm exp (-2 pi 1jk)) exp (2 pi 1jk / m) und plötzlich Sie Rechnen jede neue FFT in der Zeit O (m) anstelle von O (m log m), was bedeutet, dass die Gesamtkomplexität Ihrer Berechnung nun O (m (n log m)) ist, was ein Faktor log m ist Schneller als die naive Lösung. Ihre halb überlappenden FFTs sind eigentlich der letzte Schritt des FFT-Algorithmus, waren FFTs der Größe n aus 2 FFTs der Größe n / 2 zusammengesetzt, so dass ein effizienter Algorithmus für Ihr Problem sein würde. Für viele Probleme Auf einem Schiebefenster gibt es ähnlich kluge Ansätze, die die Berechnungen sehr wesentlich schneller machen. Die Angst ist, dass durch die Förderung der Verwendung eines Sliding-Fenster-Ansatz, würden wir führende Benutzer auf dem Weg eines einfachen 2x Beschleunigung, anstatt der Spezialisierte 10x oder 100x Beschleunigung. Jaime On Tue, Jun 21, 2016 at 1:15 PM, Nils Werner. gt schrieb: Das Beispiel war offensichtlich nur gewählt, um das Beispiel so klein wie möglich zu halten. Ich bin nicht sicher, ob ich verstehe, warum fast jede Funktion auf, dass es ineffizient wäre. Ein weiteres Beispiel ist die Berechnung des Spektrogramms eines Signals, bei dem das Schiebefenster gt2x schneller als eine for-Schleife ist: import time import numpy import scipy. signal import matplotlib. pyplot als plt winlen 256 schrittgröße winlen // 2 siglen 44100 10 Mit sliding window start time. clock () ein numpy. sin (numpy. arange (siglen) 2 numpy. pi 16000 / 44.100,0) ein slidingwindow (a, sizewinlen, stepsizestepsize) B numpy. fft. fft (A scipy. signal. windows. hamming (winlen ), axis1) print time. clock () - 0,037622 auf meinem Rechner starten numpy. sin (numpy. arange (siglen) 2 numpy. pi 16000 / 44.100,0) idxlist Bereich (0, len Verwendung für Loop-Start time. clock () (a) - winlen, Schrittgrßenregister) C numpy. zeros ((len (idxlist), winlen), dtypecomplex) für o, i in enumerate (idxlist): Co. numpy. fft. fft (ai: iwinlen scipy. signal. windows. hamming (winlen)) print time. clock -) plt. figure () plt. imshow (numpy () 0,080116 auf meiner Maschine drucken numpy. allclose (B, C) Wahre plt. imshow (numpy. abs (B starten). Abs (C)) plt. show () Sie erhalten diese, weil Sie kommentiert haben. Antworten Sie auf diese E-Mail direkt, sehen sie auf GitHub lt7753 (Kommentar) gt, oder schalten Sie den Faden ltgithub / Meldungen / Abmelden / ADMGdr2DYofUpnyTLuOf-jQ9lpsU3Ldks5qN8fqgaJpZM4I4RX9 gt. - (/) (O. o) (gt lt) Este es Conejo. Copia a Conejo en tu firma und aydale en sus Flugzeuge de dominacin mundial. Ja, Sie können eine überlappende FFT so optimieren. Auch hier spreche ich nicht über eine spezielle Usecase hier. Es schmerzt mich, es zu sagen, aber ich sehe Dinge aus dem Rapid Prototyping wissenschaftlichen Code Seite der Dinge. Ich habe noch zu kommen wissenschaftlichen Code, der tatsächlich tut solche Optimierungen und doesnt einfach hinunter die einfache Scheibe und vectorize Straße. Als ich einige zufällige Idee versuche heraus hatte ich interessiert bin ich nicht in meinem lappenden Operationen vorzeitig zu optimieren, ich will es nur recht schnell und wartbar wie möglich für so wenig Geld zu sein. A for Schleife gibt mir weder: Der Code ist schwer zu lesen und es wird langsam sein. Ihre Lösung gibt mir eine nur: Es schreit schnell sein kann, aber in der Nähe unmöglich schnell auf iterieren oder aufrechtzuerhalten durch nicht-CS-Ingenieure oder allein Studenten lassen. Ein Schiebefenster Implementierung beseitigt die meisten der Schleifen und off-by-one Fehler und zugleich eine angemessene Beschleunigung liefern. Wenn es um die tatsächlichen Produktions-Code mit mehr Maintainers und Tests und einige innere Schleifen in C durchgeführt Ihre Umsetzung macht natürlich mehr Sinn macht. In Anbetracht dessen, dass sowohl scipy als auch matplotlib ihre spektrogrammbezogenen Funktionen mit genau diesem Ansatz und nicht mit einem effizienteren Ansatz implementieren, scheint es, dass wir diesen Weg bereits verloren haben. Ich denke, es gibt zwei Probleme mit effizienteren Ansätzen. Erstens erfordert es verschiedene Ansätze für jede Berechnung, die Sie tun möchten. Zweitens, es erfordert jemanden, um tatsächlich alle diese besonderen Fälle zu implementieren. Angesichts der Tatsache, dass auch in den vermeintlich offensichtlichen Fall mit FFT niemand getreten hat, dies zu tun, scheint es nicht, dass dies geschieht. Ich denke, der einfachste Ansatz wäre nicht so viel, um spezielle Funktionen für jede Berechnung, die Sie wollen, sondern erstellen Sie eine einzige Funktion, die die Fensterlänge, überlappen, ein mögliches Fenster und eine Funktion. Es würde dann mit Schritten, um die richtige Form zu erstellen, dann das Fenster (wenn vorhanden), dann wenden Sie die Funktion. Matplotlib und scipy tun bereits die ersten beiden Schritte, so dass es einfach wäre, ihren Code in eine allgemeine Funktion zu übersetzen, die mit jeder Funktion arbeiten könnte, die einen Vektor benötigt. Um vollständig geöffnet zu sein, implementierte ich die schrittweise Annäherung in matplotlib, aber vorher, dass es den gleichen Algorithmus verwendete, der mit einer Schleife benutzt wurde, also war dieses eine Verbesserung gegenüber, was vorher bestand. Diese Funktionalität wird auch in scikit-image (viewaswindows) und scikit-learn (extractpatches) repliziert. Auch wenn eine neue Bequemlichkeitsfunktion unter numpy. lib. stridetricks leben würde, denke ich nicht, daß Benutzer mehr ermutigt werden, einen solchen Ansatz zu verwenden, als sie bereits sind.


No comments:

Post a Comment