Le matrici numpy sono strettamente bidimensionali, mentre le matrici numpy (ndarrays) sono N-dimensionali. Gli oggetti Matrix sono una sottoclasse di ndarray, quindi ereditano tutti gli attributi e i metodi di ndarrays.
Il vantaggio principale delle matrici intorpidite è che forniscono una comoda notazione per la moltiplicazione di matrici: se aeb sono matrici, allora a*b
è il loro prodotto di matrice.
import numpy as np
a = np.mat('4 3; 2 1')
b = np.mat('1 2; 3 4')
print(a)
# [[4 3]
# [2 1]]
print(b)
# [[1 2]
# [3 4]]
print(a*b)
# [[13 20]
# [ 5 8]]
D'altra parte, a partire da Python 3.5, NumPy supporta la moltiplicazione di matrici di infissi utilizzando l' @
operatore, in modo da poter ottenere la stessa comodità di moltiplicazione di matrici con ndarrays in Python> = 3.5.
import numpy as np
a = np.array([[4, 3], [2, 1]])
b = np.array([[1, 2], [3, 4]])
print(a@b)
# [[13 20]
# [ 5 8]]
Sia gli oggetti matrice che gli ndarrays devono .T
restituire la trasposizione, ma anche gli oggetti matrice hanno .H
per la trasposizione coniugata e .I
per l'inverso.
Al contrario, gli array intorpiditi rispettano costantemente la regola secondo cui le operazioni vengono applicate in termini di elementi (ad eccezione del nuovo @
operatore). Pertanto, se a
e b
sono matrici intorpidite, allora a*b
è l'array formato moltiplicando i componenti in termini di elementi:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Per ottenere il risultato della moltiplicazione della matrice, usi np.dot
(o @
in Python> = 3.5, come mostrato sopra):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
L' **
operatore si comporta anche diversamente:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Poiché a
è una matrice, a**2
restituisce il prodotto matrice a*a
. Poiché c
è un ndarray, c**2
restituisce un ndarray con ciascun componente al quadrato dell'elemento.
Esistono altre differenze tecniche tra oggetti matrice e ndarrays (che hanno a che fare con la np.ravel
selezione degli oggetti e il comportamento della sequenza).
Il vantaggio principale delle matrici insensibili è che sono più generali delle matrici bidimensionali . Cosa succede quando si desidera un array tridimensionale? Quindi devi usare un ndarray, non un oggetto matrice. Pertanto, imparare a usare gli oggetti matrice è più lavoro: devi imparare le operazioni con gli oggetti matrice e le operazioni ndarray.
Scrivere un programma che mescola matrici e matrici ti rende la vita difficile perché devi tenere traccia di quale tipo di oggetto sono le tue variabili, per evitare che la moltiplicazione restituisca qualcosa che non ti aspetti.
Al contrario, se rimani solo con ndarrays, puoi fare tutto ciò che gli oggetti matrice possono fare, e altro, tranne con funzioni / notazioni leggermente diverse.
Se sei disposto a rinunciare all'appeal visivo della notazione del prodotto a matrice NumPy (che può essere raggiunto quasi altrettanto elegantemente con ndarrays in Python> = 3.5), allora penso che gli array NumPy siano sicuramente la strada da percorrere.
PS. Naturalmente, davvero non c'è bisogno di scegliere uno a discapito dell'altro, dal momento che np.asmatrix
e np.asarray
permetterà di convertire l'uno all'altro (fino a quando la matrice è 2-dimensionale).
C'è una sinossi delle differenze tra NumPy arrays
e NumPy matrix
es qui .