Ответ 1
phases = (phases + np.pi) % (2 * np.pi) - np.pi
В Python numpy существует функция unwrap, которая:
Развернуть радианную фазу p, изменяя абсолютные прыжки больше, чем discont к их дополнению 2 * pi вдоль данной оси.
Теперь я хотел бы сделать противоположную функцию. Как я могу обернуть массив фаз? Например. как преобразовать все углы, чтобы ограничить их между -π и π?
Очевидным способом было бы сделать что-то вроде:
for i, a in enumerate(phases):
while a < pi:
a += 2 * pi
while a > pi:
a -= 2 * pi
phases[i] = a
но есть ли более простой/быстрый способ?
phases = (phases + np.pi) % (2 * np.pi) - np.pi
import numpy as np
phases = np.arctan2(np.sin(phases), np.cos(phases))
Это работает потому, что sin (фазы)/cos (фазы) == tan (фазы). Мы возвращаем фазы (по модулю 2π), используя обратную касательную функцию. Математически обратная касательная функция многозначна, поэтому в языках программирования обычно определяется возврат фазы в фиксированный интервал.
Двухпараметрическая арктангентная функция, т.е. np.arctan2(numerator, denominator)
, такая же, как и регулярная арктангентная функция, за исключением того, что она отслеживает знаки числителя и знаменателя и, следовательно, может возвращать фазу по модулю 2π вместо регулярная функция np.arctan(numerator/denominator)
, которая может только возвращать фазу по модулю π. Реализация Numpy функции arctan2
определена для возврата фазы в диапазоне [-π, + π], который является диапазоном, который запросил OP.
Дополнительное объяснение: Этот метод arctan2 следует непосредственно из комплексного представления и полностью математически эквивалентен:
phases = np.angle(np.exp(1j*phases))
который может быть более интуитивным. Фактически, функция numpy angle
использует arctan2
за кулисами для разделения мнимой и вещественной составляющих экспоненты, то есть синуса и косинуса.
Этот ответ - небольшая вариация ответа sega_sai, которая:
phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
Это отображает фазы в [-pi, pi) → , что означает, что pi отображается на -pi
Показан здесь:
In [27]: phases = np.pi
In [28]: phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
In [29]: print phases
-3.14159265359
Это совершенно законно, но если вам нужно отобразить (-pi, pi), то
Время ввода и вывода операции buy -1. Например:
phases = (( -phases + np.pi) % (2.0 * np.pi ) - np.pi) * -1.0