Dans 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 matricielle légale et devrait me donner un (97,1)
vecteur
ÉDITER:
J'ai corrigé cela en utilisant X.dot(y)
mais la question d'origine demeure.
X*y
ne devrait pas fonctionner (et cela ne fonctionne pas), maisnp.dot(X,y)
etX.dot(y))
devrait fonctionner (et pour moi, ils le font).*
n'est pas une multiplication matricielle pour lesndarray
objets.Réponses:
dot
est la multiplication matricielle, mais*
fait autre chose.Nous avons deux tableaux:
X
, forme (97,2)y
, forme (2,1)Avec les tableaux Numpy, l'opération
est effectué par élément, mais 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 diffusion. Les dimensions dont la taille est 1 ou qui manquent peuvent être utilisées en radiodiffusion.
Dans l'exemple ci-dessus, les dimensions sont incompatibles, car:
Ici, il y a des nombres contradictoires dans la première dimension (97 et 2). C'est ce dont la ValueError ci-dessus se plaint. La deuxième dimension serait correcte, car le numéro 1 n'est pas en conflit avec quoi que ce soit.
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
ety
sont de typenumpy.matrix
, alors l'astérisque peut être utilisé comme multiplication matricielle. Ma recommandation est de rester à l'écartnumpy.matrix
, cela a tendance à compliquer plus que simplifier les choses.)Vos tableaux devraient être bien avec
numpy.dot
; si vous obtenez une erreurnumpy.dot
, vous devez avoir un autre bogue. Si les formes sont incorrectesnumpy.dot
, vous obtenez une exception différente:Si vous obtenez toujours cette erreur, veuillez publier un exemple minimal du problème. Un exemple de multiplication avec des tableaux en forme de vôtre réussit:
la source
Par docs numpy :
En d'autres termes, si vous essayez de multiplier deux matrices (dans le sens de l'algèbre linéaire), vous le souhaitez,
X.dot(y)
mais si vous essayez de diffuser des scalaires de matricey
vers,X
vous devez effectuerX * y.T
.Exemple:
la source
Il est possible que l'erreur ne se soit pas produite dans le produit scalaire, mais après. Par exemple, essayez ceci
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 5x12) mais numpy vous donnera
L'erreur est trompeuse; cependant, il y a un problème sur cette ligne.
la source
Utilisez
np.mat(x) * np.mat(y)
, cela fonctionnera.la source
Vous recherchez
np.matmul(X, y)
. Dans Python 3.5+, vous pouvez utiliserX @ y
.la source
Nous pourrions nous demander que a * b est un produit scalaire.
Mais en fait, il est diffusé.
Produit scalaire : a.dot (b)
Diffuser:
(m, n) + - / * (1, n) → (m, n): l'opération sera appliquée à m lignes
la source