web-dev-qa-db-fra.com

Python Numpy - Complex Numbers - Existe-t-il une fonction de conversion polaire en rectangle?

Existe-t-il une fonction Numpy intégrée permettant de convertir un nombre complexe sous forme polaire, une magnitude et un angle (degrés) en un nombre en composants réels et imaginaires?

Clairement, je pourrais écrire le mien, mais il semble que ce soit le type de chose pour lequel une version optimisée est incluse dans certains modules.

Plus précisément, j'ai un tableau de grandeurs et un tableau d'angles:

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

Et ce que j'aimerais, c'est:

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

Il n'y a pas de fonction pour faire exactement ce que vous voulez, mais il y aangle, qui fait la partie la plus difficile. Ainsi, par exemple, on pourrait définir deux fonctions:

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

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

Ces fonctions utilisent des radians pour l’entrée et la sortie, et pour les degrés, il faudrait effectuer la conversion en radians dans les deux fonctions.

Dans numpy référence , il y a une section sur la gestion des nombres complexes, et c’est là que la fonction que vous recherchez serait répertoriée (donc, comme ils ne sont pas là, je ne pense pas qu’ils existent dans numpy).

9
tom10

Il y a une erreur dans la réponse précédente qui utilise numpy.vectorize - cmath.rect n'est pas un module pouvant être importé. Numpy fournit également la fonction deg2rad qui fournit un morceau de code plus propre pour la conversion d’angle. Une autre version de ce code pourrait être:

import numpy as np
from cmath import rect

nprect = np.vectorize(rect)

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

Le code utilise la fonction vectorize de numpy pour renvoyer une version de style numpy de la fonction cmath.rect de la bibliothèque standard qui peut être appliquée élément par élément dans des tableaux numpy.

3
dyqik

J'ai utilisé cmath with 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)]
1
atomh33ls
import numpy as np
import cmath.rect

nprect = np.vectorize(rect)

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

tom10 answer fonctionne bien ... vous pouvez également développer la formule d'Euler pour:

def P2R(A, phi):
    return A * ( np.cos(phi) + np.sin(phi)*1j )
0
Thomio