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)