Numpy matrizes são estritamente 2-dimensional, enquanto numpy matrizes (ndarrays) são N-dimensional. Objetos de matriz são uma subclasse de ndarray, portanto eles herdam todos os atributos e métodos de ndarrays.
A principal vantagem das matrizes numpy é que elas fornecem uma notação conveniente para multiplicação de matrizes: se a e b são matrizes, então a*b
é o seu produto de matriz.
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]]
Por outro lado, a partir do Python 3.5, o NumPy suporta a multiplicação de matrizes infix usando o @
operador, para que você possa obter a mesma conveniência da multiplicação de matrizes com ndarrays no 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]]
Os objetos da matriz e os ndarrays precisam .T
retornar a transposição, mas os objetos da matriz também têm .H
para a transposição do conjugado e .I
para o inverso.
Por outro lado, matrizes numpy obedecem consistentemente à regra de que operações são aplicadas em elementos (exceto para o novo @
operador). Assim, se a
e b
são matrizes numpy, então a*b
a matriz é formada pela multiplicação dos componentes por elementos:
c = np.array([[4, 3], [2, 1]])
d = np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
# [6 4]]
Para obter o resultado da multiplicação de matrizes, use np.dot
(ou @
em Python> = 3.5, como mostrado acima):
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
O **
operador também se comporta de maneira diferente:
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]
Como a
é uma matriz, a**2
retorna o produto da matriz a*a
. Como c
é um ndarray, c**2
retorna um ndarray com cada componente quadrado ao elemento.
Existem outras diferenças técnicas entre os objetos da matriz e os ndarrays (relacionados à np.ravel
seleção de itens e comportamento de sequência).
A principal vantagem de matrizes numpy é que elas são mais gerais que matrizes bidimensionais . O que acontece quando você deseja uma matriz tridimensional? Então você precisa usar um ndarray, não um objeto de matriz. Assim, aprender a usar objetos de matriz é mais trabalhoso - você precisa aprender operações de objetos de matriz e operações de matriz.
Escrever um programa que mescla matrizes e matrizes dificulta sua vida, porque você precisa acompanhar o tipo de objeto que suas variáveis são, para que a multiplicação não retorne algo que você não espera.
Por outro lado, se você se ater apenas aos ndarrays, poderá fazer tudo o que os objetos da matriz podem fazer e muito mais, exceto com funções / notações ligeiramente diferentes.
Se você está disposto a desistir do apelo visual da notação de produto da matriz NumPy (que pode ser alcançada com a mesma elegância com ndarrays em Python> = 3.5), acho que as matrizes NumPy são definitivamente o caminho a percorrer.
PS. Claro, você realmente não tem que escolher um em detrimento do outro, uma vez np.asmatrix
e np.asarray
permitem converter um para o outro (desde que a matriz é 2-dimensional).
Há uma sinopse das diferenças entre NumPy arrays
vs NumPy matrix
es aqui .