0Pricing
Pandas & NumPy Academy · Lezione

Moltiplicazione di matrici con np.matmul e @

Moltiplichi correttamente le matrici con np.matmul e l'operatore @, distinguendo la moltiplicazione elemento per elemento * dalla vera moltiplicazione matriciale.

Moltiplicazione di matrici con np.matmul e @ è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Perché la moltiplicazione tra matrici è importante

La moltiplicazione tra matrici è fondamentale nella data science e nel machine learning. È alla base delle reti neurali, della riduzione della dimensionalità e delle trasformazioni lineari. In Python, NumPy offre due modi chiari per moltiplicare le matrici: la funzione np.matmul() e l'operatore @, introdotto in Python 3.5. Entrambi sono veloci, vettorializzati e molto più efficienti dei cicli Python annidati.

Le regole della moltiplicazione tra matrici

Per due matrici A e B, il prodotto A @ B è valido solo quando il numero di colonne di A è uguale al numero di righe di B. Se A ha forma (m, n) e B ha forma (n, k), il risultato ha forma (m, k). Questa regola è chiamata vincolo delle dimensioni interne e si applica indipendentemente dalla funzione NumPy utilizzata.

import numpy as np
A = np.array([[1, 2], [3, 4]])   # shape (2, 2)
B = np.array([[5, 6], [7, 8]])   # shape (2, 2)
C = A @ B
print(C)  # [[19 22] [43 50]]

np.matmul e l'operatore @

np.matmul(A, B) e A @ B producono risultati identici per gli array 2D. L'operatore @ è semplicemente zucchero sintattico: internamente chiama __matmul__, che NumPy implementa usando la stessa routine BLAS a livello C. Utilizzare @ nel codice quotidiano per una maggiore leggibilità; utilizzare np.matmul quando si desidera passare la funzione come callable o gestire esplicitamente i casi limite.

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.matmul(A, B))   # same as A @ B
print(A @ B)             # same result

Distinguere @ da * e np.dot

NumPy dispone di tre funzioni di moltiplicazione che possono essere facilmente confuse. A * B è una moltiplicazione elemento per elemento (prodotto di Hadamard). np.dot(A, B) si comporta come np.matmul per gli array 2D, ma ha una semantica diversa per le dimensioni superiori. A @ B è esclusivamente una moltiplicazione tra matrici e segue con precisione la definizione matematica: per le operazioni sulle matrici, lo si preferisca a np.dot.

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print('element-wise:', A * B)    # [[5 12] [21 32]]
print('matmul:', A @ B)          # [[19 22] [43 50]]

La moltiplicazione tra matrici non è commutativa

A differenza della moltiplicazione tra scalari, la moltiplicazione tra matrici non è commutativa: in generale A @ B è diverso da B @ A. Le forme potrebbero persino non essere compatibili in entrambe le direzioni. Questo è importante quando si scrivono trasformazioni: l'ordine delle operazioni modifica il risultato. Tenere sempre traccia della matrice che si trova a sinistra e di quella che si trova a destra.

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[0, 1], [1, 0]])
print('A @ B:', A @ B)   # [[2 1] [4 3]]
print('B @ A:', B @ A)   # [[3 4] [1 2]]  -- different!

Moltiplicazione tra matrici a batch

Quando gli array hanno più di due dimensioni, np.matmul e @ trattano le dimensioni iniziali aggiuntive come dimensioni di batch e moltiplicano le matrici in parallelo. Per esempio, un array di forma (32, 3, 4) moltiplicato per uno di forma (32, 4, 5) produce un risultato di forma (32, 3, 5): 32 moltiplicazioni indipendenti 3×4 @ 4×5 eseguite simultaneamente. È così che i framework di deep learning elaborano in modo efficiente i mini-batch.

import numpy as np
batch_A = np.random.rand(32, 3, 4)
batch_B = np.random.rand(32, 4, 5)
result = batch_A @ batch_B
print(result.shape)  # (32, 3, 5)

Moltiplicazione matrice-vettore

Un caso particolare comune consiste nel moltiplicare una matrice per un vettore. Se A ha forma (m, n) e v è un array 1D di lunghezza n, allora A @ v produce un array 1D di lunghezza m. NumPy gestisce automaticamente l'allineamento delle forme: non è necessario trasformare v in un vettore colonna. Questo schema è presente ovunque: nell'applicazione dei pesi nella regressione lineare, nella proiezione delle feature e nel calcolo simultaneo dei prodotti scalari per ogni riga.

import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]])  # (2, 3)
v = np.array([1, 0, -1])              # (3,)
print(A @ v)   # [1-3, 4-6] = [-2, -2]

Prestazioni: @ e cicli Python

La moltiplicazione tra matrici di NumPy chiama routine BLAS/LAPACK ottimizzate ed esegue il codice C compilato. Un ciclo annidato scritto interamente in Python che implementi la stessa operazione è in genere da 100 a 1000 volte più lento per le matrici grandi. Quando sono necessari prodotti tra matrici ripetuti in una pipeline di dati — trasformazioni delle feature, proiezioni PCA, aggiornamenti dei pesi — utilizzare sempre @ o np.matmul e non implementare mai personalmente il ciclo interno.

import numpy as np, time
A = np.random.rand(500, 500)
B = np.random.rand(500, 500)
t0 = time.time()
C = A @ B
print(f'NumPy: {(time.time()-t0)*1000:.1f} ms')  # single-digit ms

Concatenazione di più prodotti tra matrici

È possibile concatenare più operazioni @ in un'unica espressione: A @ B @ C viene valutata da sinistra verso destra. NumPy non ottimizza automaticamente l'ordine delle moltiplicazioni (a differenza di MATLAB con mtimes), quindi, se le matrici hanno dimensioni molto diverse, l'ordine può influire sulla velocità. Per tre o più matrici, considerare l'uso di np.linalg.multi_dot([A, B, C]), che seleziona automaticamente l'associazione più efficiente.

import numpy as np
A = np.random.rand(100, 20)
B = np.random.rand(20, 50)
C = np.random.rand(50, 10)
result = np.linalg.multi_dot([A, B, C])
print(result.shape)  # (100, 10)

Errori comuni nelle forme e come correggerli

L'errore più comune nella moltiplicazione tra matrici è una mancata corrispondenza delle forme: ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0. Per risolvere il problema, controlli le forme con A.shape e verifichi che le dimensioni interne coincidano. Se ha un vettore riga di forma (n,) che deve essere trattato come un vettore colonna di forma (n, 1), usi v.reshape(-1, 1). Se le serve la trasposta, usi A.T.

import numpy as np
A = np.ones((3, 4))
B = np.ones((3, 4))  # wrong -- inner dims 4 != 3
try:
    A @ B
except ValueError as e:
    print('Error:', e)
print('Fix:', (A @ B.T).shape)  # (3, 3)

Esempio pratico: trasformazione delle feature

Un caso d'uso tipico nella data science: si dispone di un dataset X di forma (n_samples, n_features) e di una matrice dei pesi W di forma (n_features, n_outputs). Il prodotto tra matrici X @ W applica una trasformazione lineare a ogni campione simultaneamente, producendo una forma (n_samples, n_outputs). Questo è il calcolo fondamentale di un livello lineare in una rete neurale e della previsione nella regressione lineare.

import numpy as np
n_samples, n_features, n_outputs = 200, 10, 3
X = np.random.rand(n_samples, n_features)
W = np.random.rand(n_features, n_outputs)
b = np.zeros(n_outputs)
predictions = X @ W + b   # shape (200, 3)
print(predictions.shape)

Verifica rapida

Verifichi la sua comprensione della moltiplicazione tra matrici in NumPy.

Riepilogo della lezione

In questa lezione ha imparato che: np.matmul e @ implementano una vera moltiplicazione tra matrici (non elemento per elemento), le dimensioni interne delle due matrici devono coincidere e @ supporta la moltiplicazione in batch sulle dimensioni iniziali. Prossimamente esploreremo determinanti, inverse e trasposte: le operazioni che indicano se una matrice può essere «annullata».

Domande Frequenti

La lezione «Moltiplicazione di matrici con np.matmul e @» è gratuita?

Sì — il testo completo di «Moltiplicazione di matrici con np.matmul e @» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.

Cosa imparerò in «Moltiplicazione di matrici con np.matmul e @»?

Moltiplichi correttamente le matrici con np.matmul e l'operatore @, distinguendo la moltiplicazione elemento per elemento * dalla vera moltiplicazione matriciale. Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?

Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Moltiplicazione di matrici con np.matmul e @»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?

Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Moltiplicazione di matrici con np.matmul e @
  2. Determinanti, inverse e trasposte
  3. Risoluzione di sistemi lineari
  4. Panoramica su autovalori e SVD
← Torna a Pandas & NumPy Academy