Python numpy ValueError: los operandos no se pudieron transmitir junto con las formas

129

En numpy, tengo dos "matrices", Xes (m,n)y yes un vector(n,1)

utilizando

X*y

Estoy recibiendo el error

ValueError: operands could not be broadcast together with shapes (97,2) (2,1) 

Cuando (97,2)x(2,1)es claramente una operación de matriz legal y debería darme un (97,1)vector

EDITAR:

He corregido esto usando X.dot(y)pero la pregunta original aún permanece.

yayu
fuente
2
¿Cuál es la "pregunta original"? X*yNo debería funcionar (y no lo hace), pero np.dot(X,y), y X.dot(y))debería funcionar (y para mí que hacer).
DSM
3
*no es la multiplicación de matrices para ndarrayobjetos.
user2357112 apoya a Monica el
Me metí en el mismo problema al resolver wT * X, cuando debería ser np.dot (wT, X)
Juan Zamora
X * y hace multiplicación de elementos sabios
Victor Zuanazzi

Respuestas:

93

dotes la multiplicación de matrices, pero *hace algo más.

Tenemos dos matrices:

  • X, forma (97,2)
  • y, forma (2,1)

Con matrices Numpy, la operación

X * y

se realiza por elementos, pero uno o ambos valores se pueden expandir en una o más dimensiones para hacerlos compatibles. Esta operación se llama radiodifusión. Las dimensiones en las que el tamaño es 1 o las que faltan se pueden utilizar en la radiodifusión.

En el ejemplo anterior, las dimensiones son incompatibles porque:

97   2
 2   1

Aquí hay números en conflicto en la primera dimensión (97 y 2). Eso es de lo que se queja el ValueError anterior. La segunda dimensión estaría bien, ya que el número 1 no entra en conflicto con nada.

Para obtener más información sobre las reglas de transmisión: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Tenga en cuenta que si Xy yson de tipo numpy.matrix, entonces el asterisco se puede usar como multiplicación de matrices. Mi recomendación es evitar numpy.matrix, tiende a complicar más que simplificar las cosas).

Tus matrices deberían estar bien numpy.dot; si obtiene un error numpy.dot, debe tener algún otro error. Si las formas son incorrectas numpy.dot, obtienes una excepción diferente:

ValueError: matrices are not aligned

Si aún recibe este error, publique un ejemplo mínimo del problema. Un ejemplo de multiplicación con matrices con la forma de la suya tiene éxito:

In [1]: import numpy

In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
DrV
fuente
34

Por documentos numpy :

Cuando se opera en dos matrices, NumPy compara sus formas por elementos. Comienza con las dimensiones finales y avanza. Dos dimensiones son compatibles cuando:

  • son iguales, o
  • uno de ellos es 1

En otras palabras, si usted está tratando de multiplicar dos matrices (en el sentido de álgebra lineal), entonces usted quiere X.dot(y), pero si usted está tratando de escalares de difusión desde la matriz ya Xcontinuación, es necesario realizar X * y.T.

Ejemplo:

>>> 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]])
gobrewers14
fuente
11

Es posible que el error no se haya producido en el producto escalar, sino después. Por ejemplo, prueba esto

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) estará bien; sin embargo, np.dot (a, b) * c es claramente incorrecto (12x1 X 1x5 = 12x5 que no se puede multiplicar por elementos 5x12) pero numpy te dará

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

El error es engañoso; sin embargo, hay un problema en esa línea.

Kenan
fuente
1
El mensaje de error es engañoso, ya que parece aparecer cuando las dimensiones de la matriz son incorrectas para la multiplicación por elementos.
Aung Htet
7

Use np.mat(x) * np.mat(y), eso funcionará.

usuario3101695
fuente
7

Que busca np.matmul(X, y). En Python 3.5+ puede usar X @ y.

iamanigeeit
fuente
0

Podríamos confundirnos con que a * b es un producto escalar.

Pero, de hecho, se transmite.

Producto escalar : a.dot (b)

Transmitir:

El término difusión se refiere a cómo numpy trata las matrices con diferentes dimensiones durante las operaciones aritméticas que conducen a ciertas restricciones, la matriz más pequeña se difunde a través de la matriz más grande para que tengan formas compatibles.

(m, n) + - / * (1, n) → (m, n): la operación se aplicará a m filas

chia yongkang
fuente