NumPy
Perché ti serve questo?
Section titled “Perché ti serve questo?”Le liste Python vanno bene per la maggior parte dei casi. Ma quando hai bisogno di fare calcoli matematici su migliaia o milioni di numeri, le liste diventano lente. NumPy risolve questo problema: fa le stesse operazioni ma in modo molto più veloce.
NumPy è alla base di quasi tutto l’ecosistema scientifico di Python: pandas, matplotlib, scikit-learn usano tutti NumPy internamente.
Installazione e importazione
Section titled “Installazione e importazione”pip install numpyPer convenzione, NumPy si importa sempre con il soprannome np:
import numpy as npGli array di NumPy
Section titled “Gli array di NumPy”La struttura centrale di NumPy è l’array (ndarray) — simile a una lista Python, ma pensata per i calcoli numerici.
import numpy as np
# Crea un array da una lista Pythona = np.array([1, 2, 3, 4, 5])print(a) # [1 2 3 4 5]print(type(a)) # <class 'numpy.ndarray'>print(a.dtype) # int64 — il tipo dei dati (tutti interi a 64 bit)print(a.shape) # (5,) — la forma: 5 elementi in una dimensione
# Crea una matrice (array a due dimensioni)m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print(m)print(m.shape) # (3, 3) — 3 righe, 3 colonneCreare array già pronti
Section titled “Creare array già pronti”import numpy as np
print(np.zeros(5)) # [0. 0. 0. 0. 0.] — cinque zeriprint(np.ones(4)) # [1. 1. 1. 1.] — quattro uniprint(np.zeros((2, 3))) # matrice 2×3 di zeriprint(np.eye(3)) # matrice identità 3×3 (uno sulla diagonale)print(np.arange(0, 10, 2)) # [0 2 4 6 8] — come range(), ma per arrayprint(np.linspace(0, 1, 5)) # [0. 0.25 0.5 0.75 1.] — 5 punti equidistanti tra 0 e 1print(np.random.rand(3)) # 3 numeri decimali casuali tra 0 e 1La potenza delle operazioni vettoriali
Section titled “La potenza delle operazioni vettoriali”Con le liste Python, per moltiplicare ogni elemento per 2 dovresti scrivere un ciclo. Con NumPy, le operazioni si applicano all’intero array in una volta sola:
import numpy as np
a = np.array([1, 2, 3, 4, 5])
# Operazioni su tutti gli elementi — senza scrivere cicli!print(a + 10) # [11 12 13 14 15]print(a * 2) # [ 2 4 6 8 10]print(a ** 2) # [ 1 4 9 16 25]print(a > 3) # [False False False True True]
# Operazioni tra due array (elemento per elemento)b = np.array([10, 20, 30, 40, 50])print(a + b) # [11 22 33 44 55]print(a * b) # [ 10 40 90 160 250]Questo approccio è detto vettorializzazione: invece di fare le operazioni una alla volta con un ciclo, NumPy le fa tutte insieme in modo ottimizzato.
Funzioni matematiche integrate
Section titled “Funzioni matematiche integrate”import numpy as np
a = np.array([1, 4, 9, 16, 25])
print(np.sqrt(a)) # [1. 2. 3. 4. 5.] — radice quadrata di ogni elementoprint(np.sum(a)) # 55 — somma di tutti gli elementiprint(np.mean(a)) # 11.0 — mediaprint(np.min(a)) # 1 — valore minimoprint(np.max(a)) # 25 — valore massimoprint(np.std(a)) # deviazione standardAccedere agli elementi
Section titled “Accedere agli elementi”import numpy as np
m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(m[0]) # [1 2 3] ← prima riga interaprint(m[1, 2]) # 6 ← riga 1, colonna 2print(m[:, 0]) # [1 4 7] ← tutta la colonna 0print(m[0:2, 1:3]) # [[2 3] [5 6]] ← un sotto-blocco (righe 0-1, colonne 1-2)NumPy vs liste Python: la differenza di velocità
Section titled “NumPy vs liste Python: la differenza di velocità”import numpy as npimport time
n = 1_000_000 # Un milione di numeri
# Metodo 1: lista Python con ciclolista = list(range(n))inizio = time.time()risultato = [x * 2 for x in lista]print(f"Lista Python: {time.time() - inizio:.3f} secondi")
# Metodo 2: array NumPyarray = np.arange(n)inizio = time.time()risultato = array * 2print(f"NumPy: {time.time() - inizio:.3f} secondi")NumPy è tipicamente 10-100 volte più veloce delle liste Python per operazioni numeriche. Su un milione di elementi, la differenza è notevole.
Quando usare NumPy vs liste
Section titled “Quando usare NumPy vs liste”| Situazione | Usa… |
|---|---|
| Dati misti (stringhe, numeri, oggetti) | Lista Python |
| Calcoli matematici su molti numeri | NumPy |
| Semplice raccolta di elementi | Lista Python |
| Matrici, algebra lineare, statistiche | NumPy |
| Qualsiasi libreria scientifica (pandas, matplotlib) | NumPy (lo usano internamente) |