API · NumPy

Funzione Python NumPy numpy.linalg.norm()

Scopri come numpy.linalg.norm() calcola le norme di vettori e matrici e come ord, axis e keepdims influenzano il risultato.

In questa pagina

Usa numpy.linalg.norm() per calcolare una norma a partire da un array. La forma dell’input e gli argomenti determinano se la chiamata calcola una norma vettoriale, una norma matriciale o un insieme di norme lungo assi selezionati. L’argomento ord seleziona la definizione della norma; non decide se l’input viene trattato come un vettore o una matrice.

Sintassi e parametri di numpy.linalg.norm()

La firma della funzione è:

numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
  • x è l’input di tipo array di cui si calcola la norma.
  • ord seleziona la definizione della norma. Il valore predefinito, None, usa la norma euclidea per un vettore e la norma di Frobenius per una matrice. I valori supportati dipendono dal fatto che il calcolo selezionato sia una norma vettoriale o matriciale; consulta la documentazione di NumPy per l’elenco completo.
  • axis specifica gli assi su cui eseguire il calcolo. Un intero seleziona un asse e calcola le norme vettoriali lungo quell’asse. Una tupla di due interi seleziona due assi e calcola le norme matriciali su di essi. Quando sia axis=None sia ord=None, NumPy calcola la norma dell’input appiattito, anche se ha più di due dimensioni. Per un input con più dimensioni, passa un intero a axis per calcolare le norme vettoriali lungo quell’asse oppure una tupla di due assi per calcolare le norme matriciali su quegli assi per ogni sezione rimanente.
  • keepdims ha valore predefinito False. Se è True, gli assi usati per il calcolo rimangono nel risultato con dimensione uno, il che può facilitare il broadcasting rispetto all’array originale.

Senza selezionare gli assi, il risultato è uno scalare per una norma vettoriale o matriciale. Se axis seleziona più sezioni, il risultato è un array con una norma per ciascuna sezione; keepdims=True mantiene gli assi ridotti come dimensioni di grandezza uno.

Calcolare norme vettoriali e matriciali

Per un input monodimensionale, il valore predefinito è la norma vettoriale euclidea: la radice quadrata della somma dei quadrati degli elementi. Per un input bidimensionale, il valore predefinito è la norma matriciale di Frobenius, che applica lo stesso calcolo a tutte le voci della matrice. Questo esempio autonomo mostra entrambi i calcoli:

import numpy as np

vector = np.array([3, 4])
matrix = np.array([[3, 4], [0, 12]])

print(np.linalg.norm(vector))
print(np.linalg.norm(matrix))
5.0
13.0

Il primo scalare è la norma euclidea del vettore [3, 4]. Il secondo è la norma di Frobenius della matrice, calcolata su tutte e quattro le voci.

Selezionare una norma con ord

Per i vettori, ord seleziona definizioni comuni, come 2 per la norma euclidea, 1 per la somma dei valori assoluti e np.inf per l’elemento con il valore assoluto maggiore. Per le matrici, ord="fro" seleziona la norma di Frobenius, mentre ord="nuc" seleziona la norma nucleare, cioè la somma dei valori singolari della matrice. La grafia corretta è nuc; nuuc non è un alias supportato.

L’esempio seguente confronta le norme di Frobenius e nucleare della stessa matrice:

import numpy as np

matrix = np.array([[1, 2], [3, 4]])
print(np.linalg.norm(matrix, ord="fro"))
print(np.linalg.norm(matrix, ord="nuc"))
5.477225575051661
5.8309518948453

Il primo valore è la norma di Frobenius; il secondo è la norma nucleare, cioè la somma dei valori singolari della matrice.

Per un calcolo matriciale, scegli un valore matriciale di ord. Se l’input ha più di due dimensioni, seleziona esplicitamente gli assi quando vuoi calcolare una norma vettoriale o matriciale; le combinazioni supportate dipendono dalla definizione della norma scelta e dalla versione di NumPy.

Scegliere gli assi e mantenere le dimensioni

Per un array di forma (rows, columns), axis=0 calcola una norma vettoriale per ogni colonna, mentre axis=1 ne calcola una per ogni riga. Per calcolare una norma matriciale su entrambe le dimensioni, passa axis=(0, 1):

import numpy as np

matrix = np.array([[3, 4], [0, 12]])
print(np.linalg.norm(matrix, axis=0))
print(np.linalg.norm(matrix, axis=1))
print(np.linalg.norm(matrix, axis=(0, 1), keepdims=True).shape)
[ 3.         12.64911064]
[ 5. 12.]
(1, 1)

Il primo array contiene le norme vettoriali delle due colonne e il secondo quelle delle due righe. L’ultima tupla indica la forma del risultato della norma matriciale con keepdims=True; gli assi ridotti rimangono dimensioni di grandezza uno, utili per il broadcasting successivo. Per gli array con più dimensioni, scegli gli assi che definiscono ciascuna sezione vettoriale o matriciale.