Python Numpy - Сложные числа. Есть ли функция для преобразования по полярности в прямоугольник?

Есть ли встроенная функция Numpy для преобразования комплексного числа в полярной форме, величины и угла (градусов) в единицу в реальных и мнимых компонентах?

Ясно, что я мог бы написать свой собственный, но похоже, что тип вещи, для которого есть оптимизированная версия, включенная в какой-то модуль?

В частности, у меня есть массив величин и массив углов:

>>> a
array([1, 1, 1, 1, 1])
>>> b
array([120, 121, 120, 120, 121])

И я бы хотел:

>>> c
[(-0.5+0.8660254038j),(-0.515038074+0.8571673007j),(-0.5+0.8660254038j),(-0.5+0.8660254038j),(-0.515038074+0.8571673007j)]

Ответ 1

Нет функции, которая будет делать именно то, что вы хотите, но есть angle, что делает самую трудную часть. Так, например, можно было бы определить две функции:

def P2R(radii, angles):
    return radii * exp(1j*angles)

def R2P(x):
    return abs(x), angle(x)

Эти функции используют радианы для ввода и вывода, а для градусов - для преобразования в радианы в обеих функциях.

В numpy reference есть раздел по обработке сложных чисел, и именно здесь будет указана функция, которую вы ищете (так как их там нет, я не думаю, что они существуют в пределах numpy).

Ответ 2

В предыдущем ответе ошибка, использующая numpy.vectorize - cmath.rect, не является модулем, который можно импортировать. Numpy также предоставляет функцию deg2rad, которая обеспечивает более чистый фрагмент кода для преобразования угла. Другая версия этого кода может быть:

import numpy as np
from cmath import rect

nprect = np.vectorize(rect)

c = nprect(a, np.deg2rad(b))

В коде используется функция numpy vectorize, чтобы вернуть версию стиля numpy стандартной библиотеки cmath.rect, которая может быть применена к мудрым элементам в массивах numpy.

Ответ 3

Я использовал cmath с itertools

from cmath import rect,pi
from itertools import imap
b = b*pi/180                   # convert from deg to rad
c = [x for x in imap(rect,a,b)]

Ответ 4

import numpy as np
import cmath.rect

nprect = np.vectorize(rect)

c = nprect(a,b*np.pi/180)