HOWTO · NumPy

Divisione Element-Wise in Python NumPy

Esistono due metodi principali che possono essere utilizzati per eseguire una divisione per elemento su array NumPy in Python, la funzione numpy.divide() e l'operatore /.

In questa pagina

Per dividere i valori corrispondenti in array NumPy, usa numpy.divide(x1, x2) oppure x1 / x2. Entrambe le forme eseguono una divisione vera elemento per elemento e restituiscono un array; scegli la funzione quando i suoi argomenti opzionali, come out o where, aiutano a controllare il risultato.

Uso di numpy.divide()

numpy.divide() accetta prima il dividendo e poi il divisore. Quando gli array hanno la stessa forma, ogni valore del primo array viene diviso per il valore nella posizione corrispondente del secondo. Assegna l’array restituito a una variabile se ti serve usarlo in seguito. L’argomento out è facoltativo: omettilo per fare in modo che NumPy crei e restituisca un risultato, oppure passa un array esistente con forma e tipo di dato compatibili per scrivere i risultati in quella memoria.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

import numpy as np

numerators = np.array([12, 18, 24])
denominators = np.array([3, 6, 8])
by_function = np.divide(numerators, denominators)
destination = np.array([0.0, 0.0, 0.0])
np.divide(numerators, denominators, out=destination)
by_operator = numerators / denominators
print(by_function)
print(by_operator)
print(destination)
[4. 3. 3.]
[4. 3. 3.]
[4. 3. 3.]

La prima chiamata alla funzione omette out e restituisce un array appena creato. La seconda scrive in destination, creato con la forma e il tipo di dato del risultato. L’operatore usa gli stessi input, quindi tutti e tre gli array contengono gli stessi quozienti. Gli input sono interi, mentre la divisione vera produce valori in virgola mobile.

Uso dell’operatore /

Nella maggior parte delle espressioni, / è il modo più breve e chiaro per dividere gli array NumPy elemento per elemento. Scrivi result = numerators / denominators: gli operandi vengono elaborati posizione per posizione e l’array risultante può essere assegnato a una variabile, indicizzato o passato a un’altra operazione NumPy. NumPy applica le proprie regole per le operazioni sugli array quando un operando è uno scalare o quando i due array hanno forme compatibili.

L’operatore non esegue una divisione intera distinta: con array di interi, / esegue una divisione vera e rappresenta i quozienti in virgola mobile. È diverso da // in Python, che richiede la divisione per difetto. Scegli l’operatore in base all’operazione desiderata e non usare // quando ti servono quozienti frazionari.

Broadcasting, tipi di dato e divisori pari a zero

Gli array con la stessa forma dividono direttamente gli elementi corrispondenti. NumPy applica anche il broadcasting alle forme compatibili: le dimensioni vengono confrontate da destra e, per ogni coppia, devono essere uguali oppure una delle due deve essere 1. Per esempio, un array bidimensionale con forma (2, 3) può essere diviso per un array monodimensionale con forma (3,), applicando ciascun divisore a una riga. Le forme che non rispettano la regola del broadcasting non possono essere divise elemento per elemento; se si verifica una mancata corrispondenza, controlla array.shape per entrambi gli operandi.

Il tipo di dato del risultato dipende dai tipi di dato degli input e dall’operazione di divisione. In particolare, gli input interi usati con / o numpy.divide() producono risultati di divisione vera, senza troncare ogni quoziente a un intero. Se un passaggio successivo richiede un tipo di dato specifico, converti il risultato intenzionalmente dopo la divisione e valuta se la conversione eliminerebbe la parte frazionaria.

Con la divisione vera, sia / sia numpy.divide() producono risultati in virgola mobile a partire da input interi. Un divisore pari a zero può quindi produrre infinito se il numeratore è diverso da zero, oppure nan per 0 / 0, accompagnati da un avviso a runtime; questo comportamento si verifica anche con input in virgola mobile. Qui sono trattate queste forme di divisione vera; la divisione per difetto con // è un’operazione diversa e ha un comportamento distinto. Se vuoi escludere le posizioni con divisore pari a zero, inizializza prima un array di output, poi usa numpy.divide(a, b, out=result, where=b != 0): nelle posizioni in cui la condizione è falsa rimangono i valori inizializzati. Scegli un valore sostitutivo adatto ai calcoli successivi e decidi separatamente come gestire le posizioni escluse.

Scelta del metodo di divisione

Usa / per un’espressione diretta quando vuoi un quoziente elemento per elemento in forma concisa. Usa numpy.divide() quando sono utili gli argomenti della funzione, in particolare out per scrivere in un array di destinazione esistente o where per selezionare le posizioni da calcolare. Con entrambe le forme, verifica che gli operandi abbiano forme compatibili e decidi come trattare i divisori pari a zero in base ai tipi di dato utilizzati. Questi controlli rendono il codice più facile da adattare a vettori, matrici e input compatibili con il broadcasting.