Computer 4 dummy

Informatica facile a portata di tutti

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 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