it-swarm.com.de

Python Numpy - Komplexe Zahlen - Gibt es eine Funktion für die Umwandlung von Polar in Rechteck?

Gibt es eine eingebaute Numpy-Funktion, um eine komplexe Zahl in polarer Form, eine Größe und einen Winkel (Grad) in reelle und imaginäre Komponenten umzuwandeln?

Natürlich könnte ich meine eigene schreiben, aber es scheint, als ob die Art von Dingen, für die es eine optimierte Version gibt, in einem Modul enthalten ist?

Genauer gesagt, ich habe eine Reihe von Größen und eine Reihe von Winkeln:

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

Und was ich möchte ist:

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

Es gibt keine Funktion, die genau das macht, was Sie wollen, aber es gibtWINKEL, die den schwierigsten Teil macht. So könnte man beispielsweise zwei Funktionen definieren:

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

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

Diese Funktionen verwenden Radiant als Eingabe und Ausgabe, und für Grad müsste man in beiden Funktionen die Umrechnung in Radiant durchführen.

In der numpy Referenz gibt es einen Abschnitt zum Umgang mit komplexen Zahlen, und hier wird die gesuchte Funktion aufgelistet (da sie also nicht vorhanden sind, glaube ich nicht, dass sie in numpy vorhanden sind ).

9
tom10

In der vorherigen Antwort ist ein Fehler aufgetreten, der numpy.vectorize verwendet - cmath.rect ist kein Modul, das importiert werden kann. Numpy bietet auch die deg2rad-Funktion, die einen saubereren Code für die Winkelkonvertierung bereitstellt. Eine andere Version dieses Codes könnte sein:

import numpy as np
from cmath import rect

nprect = np.vectorize(rect)

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

Der Code verwendet die Vektorisierungsfunktion von numpy, um eine numpy-artige Version der cmath.rect-Funktion der Standardbibliothek zurückzugeben, die elementweise auf numpy-Arrays angewendet werden kann.

3
dyqik

Ich habe cmath mit itertools verwendet:

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 Antwort funktioniert gut ... Sie können die Euler-Formel auch erweitern auf:

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