Python >> Programma Python >  >> Python Tag >> NumPy

Di fronte a numpy.unwrap

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

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

Questo funziona perché sin(fasi)/cos(fasi) ==tan(fasi). Restituiamo le fasi (modulo 2π) usando la funzione inversa-tangente. Matematicamente, la funzione inversa-tangente è multivalore, quindi nei linguaggi di programmazione è solitamente definita per restituire la fase in un intervallo fisso.

La funzione arcotangente a due parametri, ovvero np.arctan2(numerator, denominator) , è la stessa della regolare funzione arctangente tranne per il fatto che tiene traccia dei segni del numeratore e denominatore, e quindi è in grado di restituire la fase modulo 2π, invece della regolare np.arctan(numerator/denominator) funzione che è in grado di restituire solo la fase modulo π. L'implementazione di Numpy di arctan2 La funzione è definita per restituire la fase nell'intervallo [-π, +π], che è l'intervallo richiesto dall'OP.

Spiegazione aggiuntiva:questo metodo arctan2 segue direttamente dalla rappresentazione complessa ed è interamente matematicamente equivalente a:

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

che potrebbe essere più intuitivo. E in effetti, l'angle di numpy la funzione usa arctan2 dietro le quinte per separare le componenti immaginarie e reali dell'esponenziale, ovvero il seno e il coseno.


Questa risposta è una leggera variazione della risposta sega_sai che è:

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

Questo mappa le fasi su [-pi, pi) -> il che significa che pi è mappato su -pi

Mostrato qui:

In [27]: phases = np.pi

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

In [29]: print phases
-3.14159265359

Il che è perfettamente legittimo, ma se vuoi una mappatura di (-pi, pi] allora

Volte l'input e l'output dell'operazione buy -1. Così:

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