Numpy – Altre operazioni con le matrici
Nel capitolo precedente abbiamo visto come fare le moltiplicazioni tra matrici utilizzando il pacchetto numpy per python.
In questo capitolo invece vediamo come fare altre operazioni con le matrici.
L’indice del corso lo puoi trovare a questo Link: https://computer4dummy.altervista.org/programmazione-guide-alla-programmazione/numpy-per-python/
Matrice inversa
Il caloco della matrice inversa viene fatto con la funzione inv(a).
https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.linalg.inv.html
np.linalg.inv(a)
Definiamo la matrice:
>>> A = np.array([[1,2],[3,4]])
Eseguiamo la funzione:
>>> Ainv = np.linalg.inv(A) >>> Ainv array([[-2. , 1. ], [ 1.5, -0.5]])
Matrice identità
Moltiplicando la matrice inversa per la matrice otteniamo una matrice identità es.
Ainv.dot(A) array([[ 1.00000000e+00, 4.44089210e-16], [ 0.00000000e+00, 1.00000000e+00]])
All’esterno della diagonale troviamo un valore diverso da “0” che varia a seconda della precisione di calcolo del nostro PC 4.44… e-16 è comunque un umero molto vicino allo “0” 😉
Otterremo lo stesso risultato anche eseguendo la moltiplicazione inversa:
>>> A.dot(Ainv) array([[ 1.00000000e+00, 1.11022302e-16], [ 0.00000000e+00, 1.00000000e+00]])
Determinante della matrice
Per ottenere il determinante della matrice usiamo la formula:
np.linalg.det(A)
>>> np.linalg.det(A) -2.0000000000000004
Diagonale della matrice
Per ottenere la diagonale principale della matrice la funzione da utilizzare è diag(a).
np.diag(A)
>>> np.diag(A) array([1, 4])
Prodotto esterno
Il prodotto esterno viene calcolato con la funzione outer(a,b), vediamo un esempio:
np.outer(A,B)
>>> a=np.array([1,2]) >>> b=np.array([3,4]) >>> np.outer(a,b) array([[3, 4], [6, 8]])
Prodotto interno
il calcolo del prodotto interno tra due matrici viene utilizzata la funzione inner(a,b).
np.inner(A,B)
>>> np.inner(a,b) 11
che è lo stesso risultato del prodotto .dot() delle due matrici:
>>> a.dot(b) 11
Somma della diagonale
Un altra operazione utile è la somma dei valori della diagonale che si ottiene con la funzione np.diag(A).sum()
np.diag(a).sum()
>>> np.diag(A).sum() 5
la funzione diretta per la somma della diagonale è np.trace(A)
np.trace(a)
>>> np.trace(A) 5
Autovettore e Autovalore
Partiamo con la creazione di un array X di dimensione [100, 3] composto da numeri random:
X = np.random.randn(100,3)
Calcoliamo quindi:
>>> cov = np.cov(X) >>> cov.shape (100L, 100L) >>> cov = np.cov(X.T) >>> cov array([[ 0.6812188 , -0.11172099, 0.02454426], [-0.11172099, 1.03825528, -0.06946106], [ 0.02454426, -0.06946106, 1.26167258]]) >>> np.linalg.eigh(cov) (array([0.64910922, 1.04534069, 1.28669674]), array([[ 0.96149538, -0.25783649, 0.09511566], [ 0.27472218, 0.91103372, -0.30748218], [-0.00737345, 0.32177307, 0.94678811]])) >>> np.linalg.eig(cov) (array([0.64910922, 1.04534069, 1.28669674]), array([[-0.96149538, -0.25783649, 0.09511566], [-0.27472218, 0.91103372, -0.30748218], [ 0.00737345, 0.32177307, 0.94678811]]))
Maggiori dettagli sulle funzioni eig e eigh le trovate ai link:
https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.linalg.eig.html
https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.linalg.eigh.html