Как получить угол сложного аргумента с периодом?

Пример 1

например у меня сериалы векторных

vectors = [
    [1+1j], [1j], [-1+1j], [-1], [-1-1j], [-1j], [1-1j], [1], 
    [1+1j], [1j], [-1+1j], [-1], [-1-1j], [-1j], [1-1j], [1], 
]

вы можете обнаружить, что 16 элементов в vectors фактически вращаются вокруг начала координат против часовой стрелки на 45 градусов (или пи / 4 радиана) друг друга. Так что мне действительно нужно

  pi/4,  2*pi/4,  3*pi/4,  4*pi/4,  5*pi/4,  6*pi/4,  7*pi/4,  8*pi/4, 
9*pi/4, 10*pi/4, 11*pi/4, 12*pi/4, 13*pi/4, 14*pi/4, 15*pi/4, 16*pi/4

Но np.angle(vectors) получает

pi/4, 2*pi/4, 3*pi/4, 4*pi/4, -3*pi/4, -2*pi/4, -pi/4, 0,
pi/4, 2*pi/4, 3*pi/4, 4*pi/4, -3*pi/4, -2*pi/4, -pi/4, 0

Пример 2

например, у меня есть сериалы вектора как

vectors = [
    [1], [1-j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], 
    [1], [1-j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], 
]

вы можете обнаружить, что 16 элементов в vectors фактически вращаются вокруг начала координат по часовой стрелке на 45 градусов (или пи / 4 радиана) друг друга. Так что мне действительно нужно

 0*pi/4, -1*pi/4,  -2*pi/4,  -3*pi/4,  -4*pi/4,  -5*pi/4,  -6*pi/4,  -7*pi/4, 
-8*pi/4, -9*pi/4, -10*pi/4, -11*pi/4, -12*pi/4, -13*pi/4, -14*pi/4, -15*pi/4

Пример 3

для

vectors = [
    [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], [1], 
    [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], [1], 
]

Мне нужен ответ, чтобы быть

 -*pi/4,  -2*pi/4,  -3*pi/4,  -4*pi/4,  -5*pi/4,  -6*pi/4,  -7*pi/4,  -8*pi/4, 
-9*pi/4, -10*pi/4, -11*pi/4, -12*pi/4, -13*pi/4, -14*pi/4, -15*pi/4, -15*pi/4

Общее заявление, или что мне нужно

Итак, как сделать новую функцию angle_with_period, которая удовлетворяет следующим условиям

  1. входным параметром является список / массив [v1, v2, v3...], а абс (угол между v [i] и v [i + 1]) всегда не больше, чем pi

  2. angle_with_period вычисляет угол каждого элемента от положительной действительной оси на комплексной плоскости.

  3. для v1 angle_with_period действует как np.angle, то есть


    in  |   0   |  1+1j  |   -1   | -1-1j  | 1-1j  |
    ----+-------+--------+--------+--------+-------+
    out |   0   |  pi/4  | 4*pi/4 |-3*pi/4 | -pi/4 |
  1. если vecAnswer = angle_with_period([v1, v2, v3...]), то vecAnswer представляет собой монотонно увеличивающийся или уменьшающийся массив

Благодарность

А как насчет векторов = [[1j], [1 + 1j], [1], [1-1j], [-1j], [-1-1j], [-1], [-1 + 1j], [ 1j], [1 + 1j], [1], [1-1j], [-1j], [-1-1j], [-1], [-1 + 1j]]. Какие углы для этого?

Andreas K. 15.10.2018 10:04

2 * пи / 4, пи / 4, 0, -пи / 4, ...

oyster 15.10.2018 15:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
304
1

Ответы 1

Вот один из способов использования diff, mod, cumsum:

def mono_angle(x):
    a = np.angle(x)
    b = np.trim_zeros(a, 'f')
    if b.size==0: return a
    b[1:] = np.diff(b) % (np.sign(b[0])*2*np.pi)
    a[-b.size:] = b.cumsum()
    return a

Например:

>>> vectors = [
...     [1], [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], 
...     [1], [1-1j], [-1j], [-1-1j], [-1], [-1+1j], [1j], [1+1j], 
... ]
>>> mono_angle(np.ravel(vectors))
array([  0.        ,  -0.78539816,  -1.57079633,  -2.35619449,
        -3.14159265,  -3.92699082,  -4.71238898,  -5.49778714,
        -6.28318531,  -7.06858347,  -7.85398163,  -8.6393798 ,
        -9.42477796, -10.21017612, -10.99557429, -11.78097245])

Примечание: вы также можете посмотреть аналогичный np.unwrap. Он работает на ваших примерах, но в целом не соответствует вашему описанию.

Другие вопросы по теме