J'ai deux matrices:

>>> a.shape
(100, 3, 1)
>>> b.shape
(100, 3, 3)

J'aimerais réaliser un produit scalaire tel que mon résultat final soit (100, 3, 1). Cependant, actuellement je reçois:

>>> c = np.dot(b, a)
>>> c.shape
(100, 3, 100, 1)

Quelqu'un pourrait-il expliquer ce qui se passe? Je lis la documentation et je n'arrive pas à comprendre en dehors.

Modifier:

Donc, selon la documentation (je l'ai oublié):

Si a et b sont des tableaux 2-D, il s'agit d'une multiplication matricielle, mais l'utilisation de matmul ou a @ b est préférable.

Et ça donne le résultat souhaité, mais je suis toujours curieux, que se passe-t-il ici? Quelle règle de la fonction np.dot est appliquée pour produire un résultat de (100, 3, 100, 1)?

1
datta 15 sept. 2020 à 14:22

2 réponses

Meilleure réponse

Voici comment dot fonctionne dans votre cas:

dot(b, a)[i,j,k,m] = sum(b[i,j,:] * a[k,:,m])

Votre forme de sortie correspond exactement à la spécification de la documentation:

(b.shape[0], b.shape[1], a.shape[0], a.shape[2])

Si ce n'est pas ce à quoi vous vous attendiez, vous recherchez peut-être une autre multiplication matricielle.

1
Mysterious Joe 15 sept. 2020 à 11:34

dot retournera tous les produits possibles des matrices stockées dans les deux dernières dimensions de vos tableaux. Utilisez matmul aka l'opérateur @ pour diffuser les principales dimensions au lieu de les combiner:

np.matmul(b, a)

Ou

b @ a

Le couteau suisse des produits sum est einsum, vous pouvez donc également l'utiliser:

np.einsum('aij,ajk->aik', b, a)

Ou

np.einsum('ajk,aij->aik', a, b)
1
Mad Physicist 15 sept. 2020 à 11:41