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

Resuelto yayu asked hace 10 años • 0 respuestas

En numpy, tengo dos "matrices", Xes (m,n)y yes 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.

yayu avatar Jul 04 '14 00:07 yayu
Aceptado

dotes 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 Xy yson 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)
DrV avatar Jul 03 '2014 22:07 DrV

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, yentonces Xdebes 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]])
o-90 avatar Jul 03 '2014 22:07 o-90