dot
é a multiplicação da matriz, mas *
faz outra coisa.
Temos duas matrizes:
X
, forma (97,2)
y
, forma (2,1)
Com matrizes Numpy, a operação
X * y
é feito elemento a elemento, mas um ou ambos os valores podem ser expandidos em uma ou mais dimensões para torná-los compatíveis. Essa operação é chamada de transmissão. Dimensões em que o tamanho é 1 ou que estão faltando podem ser usadas na transmissão.
No exemplo acima, as dimensões são incompatíveis porque:
97 2
2 1
Aqui, há números conflitantes na primeira dimensão (97 e 2). É disso que o ValueError acima está reclamando. A segunda dimensão estaria ok, já que o número 1 não entra em conflito com nada.
Para obter mais informações sobre regras de transmissão: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
(Por favor, note que se X
e y
forem do tipo numpy.matrix
, então o asterisco pode ser usado como multiplicação da matriz. Minha recomendação é ficar longe numpy.matrix
, isso tende a complicar mais do que simplificar as coisas.)
Seus arrays devem estar bem com numpy.dot
; se obtiver um erro em numpy.dot
, você deve ter algum outro bug. Se as formas forem erradas numpy.dot
, você receberá uma exceção diferente:
ValueError: matrices are not aligned
Se você ainda receber esse erro, poste um exemplo mínimo do problema. Um exemplo de multiplicação com matrizes no formato da sua é bem-sucedido:
In [1]: import numpy
In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
X*y
não deveria funcionar (e não funciona), masnp.dot(X,y)
eX.dot(y))
deveria funcionar (e para mim funcionam).