I logaritmi Ufunc di NumPy sono strumenti molto utili quando si lavora con numeri, array e calcoli scientifici in Python. Se stai iniziando a usare questa libreria, conoscere funzioni come np.log() e np.log10() ti aiuta a gestire trasformazioni matematiche comuni in modo rapido, pulito ed efficiente.
In NumPy, i logaritmi fanno parte delle cosiddette ufunc, cioè funzioni universali progettate per operare direttamente su array e valori numerici. Questo significa che non devi eseguire cicli manuali elemento per elemento: basta passare un array alla funzione e NumPy applicherà il calcolo a tutti i valori. È proprio qui che NumPy mostra la sua praticità.
In questa guida vedremo come usare il logaritmo naturale, il logaritmo in base 10, altre varianti disponibili e il comportamento dei logaritmi quando vengono applicati a un array NumPy. L’obiettivo è offrirti una spiegazione chiara, concreta e facilmente riutilizzabile nei tuoi progetti.
Come usare il logaritmo naturale con NumPy: np.log()
La funzione np.log() serve per calcolare il logaritmo naturale, cioè il logaritmo in base e. È una delle operazioni più frequenti in ambito matematico, statistico e nel preprocessing dei dati.
Se passi un numero singolo, NumPy restituisce il logaritmo naturale di quel valore.
import numpy as np
valore = np.log(10)
print(valore)
Quando esegui questo codice, ottieni il logaritmo naturale di 10. In molti casi, però, la vera utilità emerge quando lavori con più valori contemporaneamente.
import numpy as np
valori = np.array([1, 2, 5, 10])
risultato = np.log(valori)
print(risultato)
NumPy applica il calcolo a ogni elemento dell’array in modo automatico. Questo approccio è molto più elegante e veloce rispetto all’uso di un ciclo for tradizionale.
È importante ricordare un aspetto pratico: il logaritmo è definito solo per valori maggiori di zero. Se provi a usare
np.log(0)
oppure un numero negativo, NumPy restituirà un risultato speciale come -inf o nan, accompagnato spesso da un warning.
import numpy as np
print(np.log(0))
print(np.log(-5))
Per chi è alle prime armi, questo è un dettaglio da tenere bene a mente: prima di applicare un logaritmo ai dati, conviene verificare che non ci siano zeri o valori negativi.
Calcolare il logaritmo in base 10 con NumPy: np.log10()
La funzione np.log10() calcola il logaritmo in base 10. È molto usata quando si lavora con scale decimali, ordini di grandezza, misurazioni scientifiche e rappresentazioni numeriche più intuitive.
Il comportamento è simile a quello di np.log(), ma cambia la base del logaritmo.
import numpy as np
valore = np.log10(1000)
print(valore)
In questo caso il risultato è 3, perché 10 elevato alla terza dà 1000.
Naturalmente, anche np.log10() può essere usato con un array NumPy.
import numpy as np
valori = np.array([1, 10, 100, 1000])
risultato = np.log10(valori)
print(risultato)
Questo tipo di trasformazione è molto comune nell’analisi dei dati, soprattutto quando i valori coprono intervalli molto ampi. Applicare il logaritmo in base 10 può rendere i dati più leggibili e più semplici da confrontare.
Anche qui vale la stessa regola fondamentale: la funzione lavora correttamente solo con numeri positivi.
Altre funzioni logaritmiche di NumPy da conoscere
Oltre a np.log() e np.log10(), NumPy mette a disposizione altre funzioni logaritmiche che possono tornare molto utili in casi specifici.
Il logaritmo in base 2 con np.log2()
La funzione np.log2() calcola il logaritmo in base 2. È particolarmente interessante in informatica, teoria dell’informazione e algoritmi.
import numpy as np
valori = np.array([1, 2, 4, 8, 16])
risultato = np.log2(valori)
print(risultato)
Questo esempio restituisce valori come 0, 1, 2, 3 e 4, perché ogni numero è una potenza di 2.
Il logaritmo naturale di 1 più x con np.log1p()
Un’altra funzione meno nota ma molto utile è np.log1p(), che calcola il logaritmo naturale di 1 + x. Può sembrare un dettaglio, ma nella pratica è preziosa quando x è molto piccolo, perché offre una migliore stabilità numerica rispetto a un’espressione scritta manualmente.
import numpy as np
x = np.array([0, 0.1, 0.5, 1])
risultato = np.log1p(x)
print(risultato)
In contesti reali, questa funzione viene usata spesso in machine learning, statistica e analisi numerica.
Come ottenere logaritmi con basi diverse
NumPy non offre una funzione dedicata per ogni base possibile, ma puoi calcolare facilmente un logaritmo in una base qualsiasi sfruttando una formula semplice. Per esempio, il logaritmo in base 3 di un numero si può ottenere dividendo il logaritmo naturale del numero per il logaritmo naturale della base.
import numpy as np
valore = 81
base = 3
risultato = np.log(valore) / np.log(base)
print(risultato)
Questo approccio è pratico, chiaro e perfettamente adatto quando hai bisogno di una base non standard.
Applicare i logaritmi agli array NumPy in modo efficace
Uno dei motivi principali per cui i logaritmi Ufunc NumPy sono così apprezzati è la loro capacità di lavorare direttamente con gli array. Questa caratteristica rende NumPy una scelta eccellente per chi manipola grandi quantità di dati numerici.
Vediamo un esempio concreto con un array monodimensionale.
import numpy as np
dati = np.array([1, 10, 100, 1000, 10000])
log_dati = np.log10(dati)
print(log_dati)
Con una sola istruzione ottieni la trasformazione di tutti i valori. Lo stesso vale anche per array multidimensionali.
import numpy as np
matrice = np.array([[1, 10], [100, 1000]])
risultato = np.log10(matrice)
print(risultato)
La funzione viene applicata a ogni elemento della matrice senza cambiare la struttura dell’array. Questo comportamento è estremamente comodo quando lavori con dataset tabellari o matrici numeriche.
Se nel tuo array sono presenti valori non validi per il logaritmo, può essere utile filtrare i dati prima del calcolo.
import numpy as np
dati = np.array([0, 1, 10, -5, 100])
maschera = dati > 0
risultato = np.log(dati[maschera])
print(risultato)
Questo piccolo controllo evita warning inutili e ti consente di lavorare in modo più ordinato. Nella pratica, è una buona abitudine soprattutto quando i dati arrivano da file esterni, input utente o sorgenti non perfettamente pulite.
Un altro aspetto interessante è che le ufunc di NumPy sono pensate per essere veloci e ben integrate con l’intero ecosistema scientifico Python. Se usi i logaritmi in pipeline di analisi o trasformazione dati, noterai presto quanto sia vantaggioso affidarsi a queste funzioni invece di soluzioni manuali.