Im essayant de trouver une multiplication Matrice spéciale entièrement vectorisée (sans boucles). Fondamentalement, j'essaie de multiplier chaque ligne avec chaque ligne. par exemple a=np.array([[1,2],[3,4],[5,6]]) and b=np.array([[1,1],[2,2],[3,3]]) alors le résultat devrait être ([3,7,11],[6,14,22],[9,21,33]])

(toutes les lignes de "a" sont d'abord multipliées par la première ligne de b, ce qui nous donne (3,7,11), puis la ligne suivante de a avec toutes les lignes de be ..)

0
Roman Wögerbauer 21 mai 2020 à 11:25

3 réponses

Meilleure réponse

Voici une solution utilisant np.einsum:

>>> import numpy as np
>>> a = np.array([[1,2],[3,4],[5,6]])
>>> b = np.array([[1,1],[2,2],[3,3]])

>>> np.einsum('kj,ij->ik', a, b)
array([[ 3,  7, 11],                                                                                                                                                                                                                              
       [ 6, 14, 22],                                                                                                                                                                                                                              
       [ 9, 21, 33]])  

C'est équivalent à b@a.T, ou de manière équivalente (a@b.T).T comme les autres réponses l'ont déjà souligné.

1
Naphat Amundsen 21 mai 2020 à 10:12

La réponse:

a=np.array([[1,2],[3,4],[5,6]])
b=np.array([[1,1],[2,2],[3,3]])

res = a.dot(b.T).T

print('a =\n', a, '\n')
print('b =\n', b, '\n')
print('result =', '\n', res)

La sortie:

a =
 [[1 2]
 [3 4]
 [5 6]] 

b =
 [[1 1]
 [2 2]
 [3 3]] 

result = 
 [[ 3  7 11]
 [ 6 14 22]
 [ 9 21 33]]
0
Andrei Krivoshei 21 mai 2020 à 09:56

Vous pouvez utiliser la fonction dot dans numpy.

a = [[1,0],[0,1]]
b = [[4,1],[2,2]]
AdotB = np.dot(a,b)

AdotB est égal à [[4, 1], [2, 2]]

Mais vous devez être prudent car il lèvera ValueError si la dernière dimension de a n'est pas de la même taille que l'avant-dernière dimension de b.

0
Samyar Rahimi 21 mai 2020 à 09:34