HOWTO · NumPy

Imaginäre Zahlen in NumPy Arrays

Dieses Tutorial zeigt, wie imaginäre Zahlen in NumPy-Arrays gespeichert werden.

Auf dieser Seite

Python kennzeichnet den Imaginärteil eines komplexen Zahlenliterals mit j, zum Beispiel in 2j. NumPy-Arrays können diese komplexen Werte speichern, elementweise damit rechnen und den Real- sowie den Imaginärteil jedes Werts bereitstellen. Verwende komplexe Literale, wenn die Werte bereits feststehen. Wähle beim Erstellen eines Arrays aus reellen Eingabewerten einen komplexen dtype, wenn das Array später komplexe Ergebnisse aufnehmen soll.

NumPy-Arrays mit komplexen Zahlen erstellen

Eine imaginäre Zahl hat keinen Realteil, während eine komplexe Zahl einen Realteil mit einem Imaginärteil verbindet. Das j-Suffix in Python kennzeichnet den Imaginärteil: 2j ist rein imaginär, und 1 + 2j hat beide Komponenten. NumPy leitet einen komplexen Elementtyp ab, wenn ein Array aus komplexen Literalen erstellt wird. Das ist hilfreich, wenn die Ausgangsdaten bereits beide Teile enthalten.

Führe dieses Beispiel aus:

import numpy as np

values = np.array([1 + 2j, 3 + 4j, 5 + 6j])
print(values)
[1.+2.j 3.+4.j 5.+6.j]

Das Array enthält drei Werte. In jedem ausgegebenen Element ist die Zahl vor dem Vorzeichen der Realteil; die Zahl mit dem angehängten j ist der Imaginärteil. Die kompakte Darstellung von NumPy zeigt die Werte an, ändert aber nicht die j-Schreibweise von Python. Wenn du ein Literal schreibst, muss das j-Suffix am imaginären Term stehen. 1 + 2 würde stattdessen eine gewöhnliche reelle Zahl ergeben, da keiner der Terme als imaginär gekennzeichnet ist.

Beim Initialisieren eines Arrays einen komplexen dtype wählen

Wenn ein Array mit reellen Zahlen beginnt, später aber komplexe Ergebnisse behalten muss, wähle bei der Initialisierung einen komplexen dtype. Zum Beispiel erstellt np.ones(3, dtype=complex) drei komplexe Elemente, die mit reellen Einsen initialisiert werden. Lässt du NumPy den Typ aus ausschließlich reellen Eingabewerten ableiten, erhält das Array einen reellen dtype. Komplexe Werte lassen sich dann nicht so zuweisen, dass ihre Imaginärteile in einem reellen Array erhalten bleiben. Wenn du den Typ von Anfang an festlegst, vermeidest du diesen Verlust und machst den vorgesehenen Verwendungszweck des Arrays deutlich.

Dabei geht es um den Elementtyp des Arrays, nicht um einen separaten Vorgang zum Hinzufügen eines Imaginärteils. Ein komplexer Wert kann einen Imaginärteil von null haben und trotzdem zu einem Array mit komplexem Typ gehören. Umgekehrt macht ein reell wirkender Wert wie 1.0 ein Array nicht automatisch komplex. Verwende dtype=complex, wenn die Datenquelle reelle Werte liefert, spätere Berechnungen oder Zuweisungen aber komplexe Zahlen erfordern. Tragen die Ausgangswerte bereits Imaginärteile, kannst du direkt komplexe Literale verwenden; NumPy leitet den komplexen Typ aus diesen Werten ab.

Mit komplexen Arrays rechnen

NumPy wendet die üblichen Rechenoperatoren elementweise an, wenn zwei Arrays kompatible Formen haben. Das folgende vollständige Beispiel erstellt zwei Arrays und berechnet ihre Summe, Differenz, ihr Produkt und ihren Quotienten. Die ausgegebenen Bezeichnungen Addition, Subtraction, Multiplication und Division bleiben dabei Englisch: Sie stehen der Reihe nach für Summe, Differenz, Produkt und Quotient. Jedes Ergebnis ist ein neues Array, und die Division komplexer Zahlen folgt den üblichen Rechenregeln für komplexe Zahlen. Die Eingabewerte sind bewusst so gewählt, dass die Nenner ungleich null sind.

import numpy as np

left = np.array([1 + 2j, 3 + 4j])
right = np.array([2 + 3j, 4 + 5j])

added = left + right
subtracted = left - right
multiplied = left * right
divided = left / right

print("Addition:", added)
print("Subtraction:", subtracted)
print("Multiplication:", multiplied)
print("Division:", divided)
Addition: [3.+5.j 7.+9.j]
Subtraction: [-1.-1.j -1.-1.j]
Multiplication: [-4. +7.j -8.+31.j]
Division: [0.61538462+0.07692308j 0.7804878 +0.02439024j]

Die Arrays haben dieselbe Form, daher werden jeweils die Werte an denselben Positionen miteinander verknüpft: Das erste Element von left wird mit dem ersten Element von right kombiniert, ebenso das zweite Element. Dies ist elementweise Arithmetik und keine Matrixmultiplikation. Verwende für Matrixprodukte stattdessen eine geeignete Matrixoperation. Achte bei Divisionen auf die Nenner: Ein Nenner von null ergibt keinen endlichen Quotienten. Wähle daher Eingabewerte, die zu der beabsichtigten Berechnung passen.

Auf Real- und Imaginärteil zugreifen

Bei einem komplexen NumPy-Array liefern .real und .imag Ansichten der Real- beziehungsweise Imaginärteile. Sie sind nützlich, wenn eine spätere Berechnung nur eine der Komponenten benötigt oder du beide Teile getrennt untersuchen möchtest. Die Komponenten-Arrays behalten dieselben Elementpositionen wie das Ausgangsarray. Der Index k in jedem dieser Arrays entspricht also dem Index k im ursprünglichen komplexen Array.

import numpy as np

values = np.array([1 + 2j, 3 + 4j, 5 + 6j])
real_parts = values.real
imaginary_parts = values.imag

print("Real parts:", real_parts)
print("Imaginary parts:", imaginary_parts)

Bei den Werten dieses Beispiels sind die Realteile 1, 3 und 5; die Imaginärteile sind 2, 4 und 6. Diese Attribute trennen vorhandene Werte, ohne das ursprüngliche komplexe Array zu ändern. Wenn du aus getrennten Arrays für Real- und Imaginärteile ein komplexes Array erstellen möchtest, kombiniere sie mit real_parts + 1j * imaginary_parts; achte darauf, dass die entsprechenden Eingaben kompatible Formen haben. Mit Literalen, einem expliziten komplexen dtype, elementweisen Operatoren und dem Zugriff auf die Komponenten sind die üblichen Schritte zum Arbeiten mit imaginären Werten in NumPy-Arrays abgedeckt.