web-dev-qa-db-fra.com

python numpy ValueError: les opérandes ne peuvent pas être diffusés avec des formes

Numpy, j'ai deux "tableaux", X est (m,n) et y est un vecteur (n,1)

en utilisant

X*y

Je reçois l'erreur

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

Quand (97,2)x(2,1) est clairement une opération de matrice légale et devrait me donner un vecteur (97,1)

MODIFIER:

J'ai corrigé ceci en utilisant X.dot(y), mais la question initiale reste posée.

90
yayu

dot est une multiplication de matrice, mais * fait autre chose.

Nous avons deux tableaux:

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

Avec les tableaux Numpy, l'opération

X * y

est effectuée élément par élément, mais l'une ou les deux valeurs peuvent être développées dans une ou plusieurs dimensions pour les rendre compatibles. Cette opération s'appelle la radiodiffusion. Les dimensions dont la taille est 1 ou qui manquent peuvent être utilisées en diffusion.

Dans l'exemple ci-dessus, les dimensions sont incompatibles, car:

97   2
 2   1

Ici, il y a des nombres en conflit dans la première dimension (97 et 2). C'est ce dont se plaint le ValueError ci-dessus. La deuxième dimension serait acceptable, car le numéro 1 n'entre en conflit avec rien.

Pour plus d'informations sur les règles de diffusion: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

(Veuillez noter que si X et y sont de type numpy.matrix, alors l'astérisque peut être utilisé comme multiplication matricielle. Ma recommandation est de rester à l'écart de numpy.matrix, il a tendance à compliquer plus que simplifier les choses.)

Vos tableaux vont bien avec numpy.dot; Si vous obtenez une erreur sur numpy.dot, vous devez avoir un autre bogue. Si les formes sont incorrectes pour numpy.dot, vous obtenez une exception différente:

ValueError: matrices are not aligned

Si vous rencontrez toujours cette erreur, postez un exemple minimal du problème. Un exemple de multiplication avec des tableaux en forme de votre succès:

In [1]: import numpy

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

Selon Wes McKinney Python pour l'analyse de données

La règle de diffusion : Deux tableaux sont compatibles pour la diffusion si pour chaque dimension de fin (c'est-à-dire, à partir de la fin), les longueurs d'axe correspondent ou si l'une des longueurs est égale à 1. La diffusion est ensuite effectuée sur les dimensions manquantes et/ou de longueur 1.

En d'autres termes, si vous essayez de multiplier deux matrices (au sens de l'algèbre linéaire), vous voulez alors X.dot(y), mais si vous essayez de diffuser des scalaires de la matrice y à X, alors vous besoin d'exécuter X * y.T.

Exemple:

>>> 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]])
27
gobrewers14

Il est possible que l'erreur ne se soit pas produite dans le produit scalaire, mais après. Par exemple essayez ceci

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) ira bien; cependant np.dot (a, b) * c est clairement faux (12x1 X 1x5 = 12x5 qui ne peut pas multiplier par élément de 5x12) mais numpy vous donnera

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

L'erreur est trompeuse. Cependant, il y a un problème sur cette ligne.

10
ksooklall

Utilisez np.mat (x) * np.mat (y), cela fonctionnera.

2
user3101695