Python numpy ValueError: los operandos no se pudieron transmitir junto con las formas
En numpy, tengo dos "matrices", X
es (m,n)
y y
es un vector(n,1)
usando
X*y
Recibo 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 matricial legal y debería darme una(97,1)
vector
EDITAR:
He corregido esto usando X.dot(y)
pero la pregunta original aún permanece.
dot
es una 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 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 contradictorios en la primera dimensión (97 y 2). De eso 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 X
y y
son de tipo numpy.matrix
, entonces el asterisco se puede usar como multiplicación de matrices. Mi recomendación es mantenerse alejado de numpy.matrix
, ya que tiende a complicar más que simplificar las cosas).
Tus matrices deberían estar bien con numpy.dot
; Si recibe un error numpy.dot
, debe tener algún otro error. Si las formas son incorrectas para numpy.dot
, obtendrás 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 forma como la tuya tiene éxito:
In [1]: import numpy
In [2]: numpy.dot(numpy.ones([97, 2]), numpy.ones([2, 1])).shape
Out[2]: (97, 1)
Por numerosos documentos :
Cuando 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 estás intentando multiplicar dos matrices (en el sentido del álgebra lineal), entonces lo deseas, X.dot(y)
pero si estás intentando transmitir escalares desde una matriz, y
entonces X
debes 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]])