Os documentos numpy recomendam o uso de matriz em vez de matriz para trabalhar com matrizes. No entanto, diferentemente da oitava (que eu estava usando até recentemente), * não realiza multiplicação de matrizes, você precisa usar a função matrixmultipy (). Eu sinto que isso torna o código muito ilegível.
Alguém compartilha minhas opiniões e encontrou uma solução?
.*
sintaxe vs '*' para multiplicação de elementos versus matriz. Se houvesse isso, tudo seria mais simples, embora eu esteja surpreso que eles escolham*
significar multiplicação por elementos e não por matriz.Respostas:
O principal motivo para evitar o uso da
matrix
classe é que: a) é inerentemente bidimensional eb) há sobrecarga adicional em comparação com uma matriz numpy "normal". Se tudo o que você está fazendo é álgebra linear, fique à vontade para usar a classe matrix ... Pessoalmente, acho mais problemas do que vale a pena.Para matrizes (anteriores ao Python 3.5), use em
dot
vez dematrixmultiply
.Por exemplo
Ou nas versões mais recentes do numpy, basta usar
x.dot(y)
Pessoalmente, acho muito mais legível do que o
*
operador implicando multiplicação de matrizes ...Para matrizes no Python 3.5, use
x @ y
.fonte
x.T.dot(A.T).dot(A).dot(x)
não é ilegível, imo Para cada um o seu, no entanto. Se você está principalmente fazendo multiplicação de matrizes, use todos os meiosnumpy.matrix
!numpy.matrixmultiply
é difícil de digitar.numpy.dot
equivale à multiplicação de matrizes. Se você realmente não gosta da notação, use amatrix
classeas principais coisas a saber para operações em matrizes NumPy versus operações em matrizes NumPy são:
A matriz NumPy é uma subclasse da matriz NumPy
As operações de matriz NumPy são elemento-elemento (uma vez que a transmissão é contabilizada)
As operações da matriz NumPy seguem as regras comuns da álgebra linear
alguns trechos de código para ilustrar:
mas essas operações falharão se essas duas matrizes NumPy forem convertidas em matrizes:
embora o uso da sintaxe NP.dot funcione com matrizes ; essas operações funcionam como multiplicação de matrizes:
então você precisa de uma matriz NumPy? ou seja, uma matriz NumPy será suficiente para o cálculo de álgebra linear (desde que você saiba a sintaxe correta, ou seja, NP.dot)?
a regra parece ser que, se os argumentos (matrizes) tiverem formas (mxn) compatíveis com uma determinada operação de álgebra linear, você estará bem; caso contrário, o NumPy lança.
a única exceção que encontrei (provavelmente existem outras) é calcular a matriz inversa .
abaixo estão trechos nos quais chamei uma operação de álgebra linear pura (de fato, do módulo de álgebra linear da Numpy) e passamos em uma matriz NumPy
determinante de uma matriz:
pares de autovetores / autovalores :
norma matricial :
fatoração qr :
classificação da matriz :
condição da matriz :
A inversão requer uma matriz NumPy:
mas o pseudoinverso de Moore-Penrose parece funcionar muito bem
fonte
No 3.5, o Python finalmente conseguiu um operador de multiplicação de matrizes . A sintaxe é
a @ b
.fonte
Há uma situação em que o operador de ponto fornecerá respostas diferentes ao lidar com matrizes e ao lidar com matrizes. Por exemplo, suponha o seguinte:
Vamos convertê-los em matrizes:
Agora, podemos ver uma saída diferente para os dois casos:
fonte
Referência de http://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html
..., o uso da classe numpy.matrix é desencorajado , pois não adiciona nada que não possa ser realizado com objetos numpy.ndarray 2D e pode levar a uma confusão sobre qual classe está sendo usada. Por exemplo,
As operações scipy.linalg podem ser aplicadas igualmente a objetos numpy.matrix ou 2D numpy.ndarray .
fonte
Esse truque pode ser o que você está procurando. É uma espécie de sobrecarga simples do operador.
Você pode usar algo como a classe Infix sugerida assim:
fonte
Uma citação pertinente do PEP 465 - Um operador de infixo dedicado para multiplicação de matrizes , como mencionado por petr-viktorin, esclarece o problema que o OP estava enfrentando:
A introdução do
@
operador infix deve ajudar a unificar e simplificar o código da matriz python.fonte
A função matmul (desde o numpy 1.10.1) funciona bem para ambos os tipos e retorna o resultado como uma classe de matriz numpy:
Resultado:
Desde o python 3.5, como mencionado anteriormente, você também pode usar um novo operador de multiplicação de matrizes,
@
comoe obtenha o mesmo resultado acima.
fonte