Quais são as vantagens e desvantagens de cada um?
Pelo que vi, qualquer um pode funcionar como um substituto para o outro, se necessário, então devo me preocupar em usar os dois ou devo seguir apenas um deles?
O estilo do programa influenciará minha escolha? Estou fazendo um aprendizado de máquina usando o numpy, portanto existem muitas matrizes, mas também muitos vetores (matrizes).
A @ B
vez deA.dot(B)
, ondeA
eB
são 2Dndarray
s. Isso remove a principal vantagem de usar emmatrix
vez de plainndarray
s, IMHO.Respostas:
De acordo com os documentos oficiais, não é mais aconselhável usar a classe matrix, pois ela será removida no futuro.
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
Como outras respostas já afirmam que você pode realizar todas as operações com matrizes NumPy.
fonte
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.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.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, sea
eb
são matrizes numpy, entãoa*b
a matriz é formada pela multiplicação dos componentes por elementos:Para obter o resultado da multiplicação de matrizes, use
np.dot
(ou@
em Python> = 3.5, como mostrado acima):O
**
operador também se comporta de maneira diferente:Como
a
é uma matriz,a**2
retorna o produto da matriza*a
. Comoc
é 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
enp.asarray
permitem converter um para o outro (desde que a matriz é 2-dimensional).Há uma sinopse das diferenças entre NumPy
arrays
vs NumPymatrix
es aqui .fonte
mat**n
para uma matriz pode ser inelegantly aplicado a uma matriz comreduce(np.dot, [arr]*n)
np.linalg.matrix_power(mat, n)
np.dot(array2, array2)
as mais rápidasmatrix1*matrix2
. Isso faz sentido porquematrix
é uma subclasse de ndarray que substitui métodos especiais como__mul__
.matrix.__mul__
chamadasnp.dot
. Portanto, há reutilização de código aqui. Em vez de executar menos verificações, o usomatrix*matrix
requer uma chamada de função extra. Portanto, a vantagem de usarmatrix
é puramente sintática, e não melhor desempenho.Scipy.org recomenda que você use matrizes:
fonte
ndarray
. O principal argumento para o usomatrix
seria se o seu código fosse pesado em álgebra linear e pareceria menos claro com todas as chamadas para adot
função. Mas esse argumento desaparecerá no futuro, agora que o operador @ é aceito para uso com multiplicação de matrizes, consulte PEP 465 . Isso precisará do Python 3.5 e da versão mais recente do Numpy. A classe de matriz pode estar obsoleto no futuro distante, então é melhor usar ndarray para novo código ...scipy.sparse
matrizes. Se você usar matrizes densas e esparsas no seu código, será muito mais fácil manter issomatrix
.Apenas para adicionar um caso à lista de unutbu.
Uma das maiores diferenças práticas para mim de ndarrays numpy em comparação com matrizes numpy ou linguagens de matriz como o matlab, é que a dimensão não é preservada nas operações de redução. As matrizes são sempre 2d, enquanto a média de uma matriz, por exemplo, tem uma dimensão a menos.
Por exemplo, rebaixar linhas de uma matriz ou matriz:
com matriz
com matriz
Eu também acho que misturar matrizes e matrizes dá origem a muitas horas de depuração "felizes". No entanto, as matrizes scipy.sparse são sempre matrizes em termos de operadores como multiplicação.
fonte
Como outros já mencionaram, talvez a principal vantagem tenha
matrix
sido a de fornecer uma notação conveniente para a multiplicação de matrizes.No entanto, em Python 3,5 finalmente há um operador infixa dedicado para a multiplicação de matrizes :
@
.Nas versões recentes do NumPy, ele pode ser usado com
ndarray
s:Hoje em dia, ainda mais, em caso de dúvida, você deve se ater
ndarray
.fonte