HOWTO · NumPy

Numeri immaginari in array NumPy

Questo tutorial mostra come memorizzare numeri immaginari in array numpy.

In questa pagina

Python indica la parte immaginaria di un numero complesso letterale con j, come in 2j. Gli array NumPy possono contenere questi valori complessi, eseguire operazioni elemento per elemento e rendere accessibili le componenti reale e immaginaria di ciascun valore. Usa i numeri complessi letterali quando i valori sono già noti; scegli un dtype complesso quando crei un array da dati reali che in seguito dovrà contenere risultati complessi.

Creare array NumPy con numeri complessi

Un numero immaginario non ha una componente reale, mentre un numero complesso combina una componente reale e una immaginaria. In Python, il suffisso j indica la parte immaginaria: 2j è quindi puramente immaginario, mentre 1 + 2j ha entrambe le componenti. Quando un array viene creato da numeri complessi letterali, NumPy deduce un tipo di elemento complesso. È utile quando i dati iniziali includono già entrambe le componenti.

Esegui questo esempio:

import numpy as np

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

L’array contiene tre valori. In ciascun elemento stampato, il numero prima del segno è la componente reale e quello associato a j è la componente immaginaria. La rappresentazione compatta di NumPy mostra i valori, ma non modifica la notazione j di Python. Quando scrivi un numero letterale, mantieni il suffisso j sul termine immaginario. Scrivendo invece 1 + 2 otterresti un normale numero reale, perché nessuno dei due termini è indicato come immaginario.

Scegliere un dtype complesso durante l’inizializzazione di un array

Quando un array parte da numeri reali ma in seguito deve conservare risultati complessi, scegli un dtype complesso al momento dell’inizializzazione. Per esempio, np.ones(3, dtype=complex) crea tre elementi di tipo complesso inizializzati a partire da valori reali pari a uno. Se lasci che NumPy deduca il tipo da soli dati reali, l’array risultante avrà un dtype reale; assegnando valori complessi a un array reale, le componenti immaginarie non possono essere conservate. Impostare il tipo in anticipo evita questa perdita e rende chiaro l’uso previsto dell’array.

Questa scelta riguarda il tipo degli elementi dell’array, non un’operazione separata per aggiungere una parte immaginaria. Un valore complesso può avere una componente immaginaria pari a zero e appartenere comunque a un array di tipo complesso. Al contrario, un valore apparentemente reale come 1.0 non rende da solo complesso un array. Usa dtype=complex quando la fonte dei dati contiene valori reali ma i calcoli o le assegnazioni successive richiedono numeri complessi. Se i valori iniziali includono già componenti immaginarie, usa direttamente numeri complessi letterali: NumPy può dedurre da essi il tipo complesso.

Eseguire operazioni aritmetiche su array complessi

Quando due array hanno forme compatibili, NumPy applica i normali operatori aritmetici elemento per elemento. L’esempio completo seguente crea due array e ne calcola la somma, la differenza, il prodotto e il quoziente. Ogni risultato è un nuovo array e la divisione tra numeri complessi segue le regole usuali dell’aritmetica complessa. Gli input sono scelti appositamente in modo che gli elementi del denominatore siano diversi da zero.

Le etichette stampate nell’esempio, “Addition”, “Subtraction”, “Multiplication” e “Division”, restano in inglese: indicano rispettivamente la somma, la differenza, il prodotto e il quoziente.

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]

Gli array hanno la stessa forma, quindi vengono abbinati gli elementi corrispondenti: il primo elemento di left viene combinato con il primo di right, e lo stesso avviene per il secondo. Si tratta di operazioni elemento per elemento, non di moltiplicazione tra matrici. Per i prodotti tra matrici, usa invece un’operazione matriciale appropriata. Fai attenzione ai valori del denominatore nelle divisioni: un denominatore pari a zero non produce un quoziente finito, quindi scegli input adatti al calcolo che vuoi eseguire.

Accedere alle parti reale e immaginaria

Per un array NumPy complesso, .real e .imag forniscono viste dell’array contenenti, rispettivamente, le componenti reali e immaginarie. Sono utili quando un calcolo successivo richiede una sola componente o quando vuoi esaminare separatamente le due parti. Gli array delle componenti mantengono le stesse posizioni degli elementi dell’array di origine, quindi l’indice k di ciascuno corrisponde all’indice k nell’array complesso originale.

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)

In questo esempio, le componenti reali sono 1, 3 e 5; quelle immaginarie sono 2, 4 e 6. Questi attributi separano le componenti dei valori esistenti senza modificare l’array complesso originale. Se devi creare un array complesso a partire da array distinti di parti reali e immaginarie, combinali con real_parts + 1j * imaginary_parts e assicurati che gli input corrispondenti abbiano forme compatibili. La creazione con valori letterali, un dtype complesso esplicito, gli operatori elemento per elemento e l’accesso alle componenti coprono i passaggi più comuni per lavorare con valori immaginari negli array NumPy.