Подтвердить что ты не робот

Напротив numpy.unwrap

В 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

но есть ли более простой/быстрый способ?

4b9b3361

Ответ 1

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

Ответ 2

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 за кулисами для разделения мнимой и вещественной составляющих экспоненты, то есть синуса и косинуса.

Ответ 3

Этот ответ - небольшая вариация ответа 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