Em numpy, eu tenho dois "arrays", X
é (m,n)
e y
é um vetor(n,1)
usando
X*y
Estou recebendo o erro
ValueError: operands could not be broadcast together with shapes (97,2) (2,1)
Quando (97,2)x(2,1)
é claramente uma operação de matriz legal e deve me dar um (97,1)
vetor
EDITAR:
Eu corrigi isso usando, X.dot(y)
mas a pergunta original ainda permanece.
X*y
não deveria funcionar (e não funciona), masnp.dot(X,y)
eX.dot(y))
deveria funcionar (e para mim funcionam).*
não é multiplicação de matrizes parandarray
objetos.Respostas:
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
é 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:
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
ey
forem do tiponumpy.matrix
, então o asterisco pode ser usado como multiplicação da matriz. Minha recomendação é ficar longenumpy.matrix
, isso tende a complicar mais do que simplificar as coisas.)Seus arrays devem estar bem com
numpy.dot
; se obtiver um erro emnumpy.dot
, você deve ter algum outro bug. Se as formas forem erradasnumpy.dot
, você receberá uma exceção diferente: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:
fonte
Por numpy docs :
Em outras palavras, se você está tentando multiplicar duas matrizes (no sentido da álgebra linear), então você deseja,
X.dot(y)
mas se está tentando transmitir escalares de uma matrizy
para,X
então você precisa executarX * y.T
.Exemplo:
fonte
É possível que o erro não tenha ocorrido no produto escalar, mas depois. Por exemplo, tente isso
np.dot (a, b) ficará bem; no entanto, np.dot (a, b) * c está claramente errado (12x1 X 1x5 = 12x5 que não pode ser multiplicado por elemento 5x12), mas numpy lhe dará
O erro é enganoso; no entanto, há um problema nessa linha.
fonte
Use
np.mat(x) * np.mat(y)
, isso vai funcionar.fonte
Você está procurando
np.matmul(X, y)
. No Python 3.5+ você pode usarX @ y
.fonte
Podemos nos confundir pensando que a * b é um produto escalar.
Mas, na verdade, é transmitido.
Produto interno : a.dot (b)
Transmitir:
(m, n) + - / * (1, n) → (m, n): a operação será aplicada a m linhas
fonte