2013-04-10 7 views
20

In Python numpy, gibt es eine Funktion, die unwrap:Gegenteil von numpy.unwrap

Abwickelwerkzeug radian Phase P durch Ändern absolute größer als discont entlang der gegebenen Achse ihr 2 * pi Komplement springt.

Jetzt möchte ich die gegenteilige Funktion tun. Wie kann ich wrap ein Array von Phasen? Z.B. Wie konvertiert man alle Winkel, um sie zwischen -π und π zu beschränken?

Der offensichtliche Weg wäre, wie etwas zu tun ist:

for i, a in enumerate(phases): 
    while a < pi: 
     a += 2 * pi 
    while a > pi: 
     a -= 2 * pi 
    phases[i] = a 

aber gibt es einen einfacheren/schnelleren Weg?

Antwort

27
phases = (phases + np.pi) % (2 * np.pi) - np.pi 
+2

Ich erkannte nicht, dass ich den Operator% mit Fließkommawerten verwenden könnte. Aber warum fügst du π hinzu, bevor du den Modulus ausführst? –

+1

, da dies erforderlich ist, wenn das Ergebnis zwischen (-np.pi, np.pi) und (0,2 * np.pi) liegen muss. Wenn Sie es nicht hinzufügen, sondern nur subtrahieren, wird 0 in -> -np.pi zugeordnet, was inkorrekt ist. –

+0

Es ist offensichtlich! Ich fühle mich jetzt dumm ...Ich habe es nicht bemerkt, weil ich nur an der relativen Phase interessiert bin und nicht auf die absolute Phase geachtet habe. –

8
import numpy as np 
phases = np.arctan2(np.sin(phases), np.cos(phases)) 

Das funktioniert, weil sin (Phasen)/cos (Phasen) == tan (Phasen). Wir erhalten Phasen (Modulo 2π) zurück, indem wir die Invers-Tangens-Funktion verwenden. Mathematisch ist die Invers-Tangens-Funktion mehrwertig, so dass sie in Programmiersprachen üblicherweise so definiert ist, dass sie die Phase in einem festen Intervall zurückgibt.

Die Zweiparameter-Arkustangensfunktion, dh np.arctan2(numerator, denominator), ist die gleiche wie die reguläre Arkustangensfunktion, außer dass sie die Vorzeichen von Zähler und Nenner verfolgt und daher die Phase modulo 2π zurückgeben kann reguläre np.arctan(numerator/denominator) Funktion, die nur die Phase modulo π zurückgeben kann. Die Implementierung der arctan2-Funktion von Numpy ist so definiert, dass sie die Phase im Bereich [-π, + π] zurückgibt, was der vom OP angeforderte Bereich ist.

Zusätzliche Erläuterung: Diese Methode arctan2 folgt direkt aus der komplexen Darstellung und ist vollständig mathematisch äquivalent zu:

phases = np.angle(np.exp(1j*phases)) 

welche intuitiver sein kann. Und tatsächlich verwendet numpys angle-Funktion arctan2 hinter den Kulissen, um die imaginären und realen Komponenten der Exponentialfunktion, d. H. Den Sinus und den Kosinus, zu trennen.

+1

Bitte erläutern Sie Ihre Antworten. Der OP versteht Ihre Antwort eher mit ein paar Sätzen. – Ratbert

+0

Interessant, aber wahrscheinlich sehr ineffizient ... Aber ich gebe Ihnen eine positive Bewertung für die gut geschriebene Antwort. –

+2

Ich stimme zu, dass dies langsamer ist als die Verwendung des '%' Operators, aber es ist intuitiver für mich (aber vielleicht bin ich der einzige), weil es direkt aus der komplexen Zahlenrepräsentation folgt, siehe Bearbeiten. Außerdem muss ich nicht darüber nachdenken, ob der Operator '%' von Python das Vorzeichen des Divisors oder der Dividende behält und wie sich dies auf das Ergebnis auswirkt, oder ob ich vor und nach der Mod eine Konstante addieren und subtrahieren muss Operation, um die resultierende Phase in dem Bereich zu halten, den ich möchte. – u55

3

Diese Antwort ist eine leichte Variation Antwort auf sega_sai die lautet:

phases = (phases + np.pi) % (2 * np.pi) - np.pi 

Diese Karten Phasen [-pi, pi) -> die pi bedeutet abgebildet wird

Gezeigte hier -pi:

In [27]: phases = np.pi 

In [28]: phases = (phases + np.pi) % (2 * np.pi) - np.pi 

In [29]: print phases 
-3.14159265359 

Welche vollkommen legitim ist, aber wenn Sie eine Abbildung von (-pi, pi] dann

Mal die Ein- und Ausgabe der Operation kaufen -1. Wie so:

phases = ((-phases + np.pi) % (2.0 * np.pi) - np.pi) * -1.0