python numpy ValueError: operandos não podiam ser transmitidos junto com formas


128

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.


2
Qual é a "pergunta original"? X*ynão deveria funcionar (e não funciona), mas np.dot(X,y)e X.dot(y))deveria funcionar (e para mim funcionam).
DSM de

3
*não é multiplicação de matrizes para ndarrayobjetos.
user2357112 suporta Monica de

Tive o mesmo problema ao resolver wT * X, quando deveria ser np.dot (wT, X)
Juan Zamora

X * y faz multiplicação elemento sábio
Victor Zuanazzi,

Respostas:


92

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 Xe yforem 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)

34

Por numpy docs :

Ao operar em duas matrizes, o NumPy compara suas formas em relação aos elementos. Ele começa com as dimensões finais e segue seu caminho adiante. Duas dimensões são compatíveis quando:

  • eles são iguais, ou
  • um deles é 1

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 matriz ypara, Xentão você precisa executar X * y.T.

Exemplo:

>>> import numpy as np
>>>
>>> X = np.arange(8).reshape(4, 2)
>>> y = np.arange(2).reshape(1, 2)  # create a 1x2 matrix
>>> X * y
array([[0,1],
       [0,3],
       [0,5],
       [0,7]])

11

É possível que o erro não tenha ocorrido no produto escalar, mas depois. Por exemplo, tente isso

a = np.random.randn(12,1)
b = np.random.randn(1,5)
c = np.random.randn(5,12)
d = np.dot(a,b) * c

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á

ValueError: operands could not be broadcast together with shapes (12,1) (1,5)

O erro é enganoso; no entanto, há um problema nessa linha.


1
A mensagem de erro é realmente enganosa, pois parece aparecer quando as dimensões da sua matriz estão erradas para a multiplicação por elemento.
Aung Htet


7

Você está procurando np.matmul(X, y). No Python 3.5+ você pode usar X @ y.


0

Podemos nos confundir pensando que a * b é um produto escalar.

Mas, na verdade, é transmitido.

Produto interno : a.dot (b)

Transmitir:

O termo broadcasting se refere a como numpy trata matrizes com diferentes dimensões durante operações aritméticas que levam a certas restrições; a matriz menor é transmitida pela matriz maior para que tenham formas compatíveis.

(m, n) + - / * (1, n) → (m, n): a operação será aplicada a m linhas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.