2013-04-10 11 views
20

Pythona numpy istnieje unwrap funkcja:Naprzeciwko numpy.unwrap

Unwrap faz w radianach P zmieniając absolutnym skoki większa niż DISCONT ich 2 * pi dopełniacza wzdłuż określonej osi.

Teraz chciałbym wykonać funkcję odwrotną. Jak mogę zawinąć szereg faz? Na przykład. jak przekonwertować wszystkie kąty, aby ograniczyć je między -π i π?

Oczywistym sposobem byłoby zrobić coś takiego:

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

ale istnieje prostszy/szybszy sposób?

Odpowiedz

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

Nie zdałem sobie sprawy, że mogę użyć operatora% z wartościami zmiennoprzecinkowymi. Ale dlaczego dodajesz π przed wykonaniem modułu? –

+1

, ponieważ jest to potrzebne, jeśli potrzebujesz, aby wynik był między (-np.pi, np.pi) zamiast (0,2 * np.pi). Jeśli go nie dodasz, ale po prostu odejmiesz, 0 zostanie zamapowane na -> -np.pi, co jest nieprawidłowe –

+0

To oczywiste! Czuję się teraz głupio ...Nie zdawałem sobie z tego sprawy, ponieważ interesuje mnie tylko względna faza i nie zwracałem uwagi na fazę absolutną. –

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

ten działa, ponieważ sin (fazy)/cos (fazy) == tan (fazy). Wracamy do faz (modulo 2π) za pomocą funkcji odwrotnej-stycznej. Matematycznie, funkcja odwrotna-styczna jest wielowartościowa, więc w językach programowania zwykle definiuje się zwracanie fazy w ustalonych odstępach czasu.

Dwuparametrowa funkcja arcus tangens, czyli np.arctan2(numerator, denominator), jest taka sama jak zwykła funkcja arcus tangens, z tym, że śledzi znaki licznika i mianownika, i dlatego jest w stanie zwrócić modulo fazowe 2π, zamiast regularna funkcja np.arctan(numerator/denominator), która może tylko zwrócić modulo fazy π. Wdrożenie Numpy'ego funkcji arctan2 jest zdefiniowane, aby przywrócić fazę w zakresie [-π, + π], który jest zakresem, który zażądał OP.

dodatkowe wyjaśnienie: Metoda arctan2 wynika bezpośrednio z złożonego obrazu i jest całkowicie równoważna z matematycznego:

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

, które mogą być bardziej intuicyjne. I rzeczywiście, funkcja numpy'ego angle wykorzystuje za kulisami arctan2, aby oddzielić wyimaginowane i rzeczywiste składniki wykładniczej, tj. Sinus i cosinus.

+1

Proszę wyjaśnij swoje odpowiedzi. OP z większym prawdopodobieństwem zrozumie twoją odpowiedź kilkoma zdaniami. – Ratbert

+0

Intersting, ale prawdopodobnie bardzo nieefektywny ... Ale daję ci uprowadzenie do dobrze napisanej odpowiedzi. –

+2

Zgadzam się, że jest to wolniejsze niż użycie operatora '%', ale jest dla mnie bardziej intuicyjne (ale może jestem jedyny), ponieważ wynika bezpośrednio z reprezentacji liczby zespolonej, patrz edycja. Co więcej, nie muszę się mocno zastanawiać, czy operator '%' Pythona zachowuje znak dzielnika lub dywidendy i jak to wpływa na wynik, czy też muszę dodać, a następnie odjąć stałą przed i po wykonaniu modu operacja, aby utrzymać uzyskaną fazę w pożądanym zakresie. – u55

3

Ta odpowiedź jest niewielkie zmiany do sega_sai odpowiedź, która jest:

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

Mapuje się faz [-pi, pi) -> co oznacza PI jest mapowany do PI

przedstawiono poniżej:

In [27]: phases = np.pi 

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

In [29]: print phases 
-3.14159265359 

Który jest całkowicie zgodne z prawem, ale jeśli chcesz mapowanie (-pi, pi], a następnie

Czasy wejścia i wyjścia operacji kup -1. Podobnie jak:

phases = ((-phases + np.pi) % (2.0 * np.pi) - np.pi) * -1.0 
Powiązane problemy