web-dev-qa-db-fra.com

Multiplication matricielle éparse

J'ai cet exemple de multiplication matrice par matrice à l'aide de tableaux numpy:

import numpy as np
m = np.array([[1,2,3],[4,5,6],[7,8,9]])
c = np.array([0,1,2])
m * c
array([[ 0,  2,  6],
       [ 0,  5, 12],
       [ 0,  8, 18]])

Comment puis-je faire la même chose si m est une matrice CSR clairsemée? Cela donne une incompatibilité de dimension:

sp.sparse.csr_matrix(m)*sp.sparse.csr_matrix(c)
7

Vous pouvez appeler la méthode multiply de csr_matrix pour effectuer une multiplication ponctuelle. 

sparse.csr_matrix(m).multiply(sparse.csr_matrix(c)).todense()

# matrix([[ 0,  2,  6],
#         [ 0,  5, 12],
#         [ 0,  8, 18]], dtype=int64)
9
Elliot

Lorsque m et c sont des tableaux numpy, alors m * c n'est pas une "multiplication de matrice". Si vous pensez que c'est alors vous pouvez faire une erreur. Pour obtenir la multiplication de matrice, utilisez une classe de matrice, telle que matrix de numpy ou les classes de matrice scipy.sparse.

La raison pour laquelle vous obtenez cet échec est que, du point de vue de la matrice, c est une matrice 1x3:

c = np.matrix([0, 1, 2]) 
c.shape    # (1,3)

c = sp.csc_matrix([0, 1, 2])
c.shape    # (1,3)

Si ce que vous voulez est la multiplication de la matrice avec c, vous devez utiliser la transposition.

c = np.matrix([0, 1, 2]).transpose()
c.shape    # (3,1)

m = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
m.shape    # (3,3)

m * c
# matrix([[ 8],
#         [17],
#         [26]])
0
kingaj