web-dev-qa-db-de.com

Scipy-Matrixmultiplikation mit geringer Dichte

Ich habe dieses Beispiel einer Matrix-durch-Matrix-Multiplikation mit numpy-Arrays:

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

Wie kann ich dasselbe tun, wenn m eine spärliche CSR-Matrix ist? Dies führt zu einer Nichtübereinstimmung der Abmessungen:

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

Sie können die multiply-Methode von csr_matrix aufrufen, um eine punktweise Multiplikation durchzuführen. 

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

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

Wenn m und c numpy Arrays sind, ist m * c keine "Matrixmultiplikation". Wenn Sie denken, dass es dann ist, könnten Sie einen Fehler machen. Um eine Matrixmultiplikation zu erhalten, verwenden Sie eine Matrixklasse, wie matrix von numpy oder die Matrixklassen scipy.sparse.

Sie erhalten den Fehler, weil c aus Matrixsicht eine 1x3-Matrix ist:

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

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

Wenn Sie die Matrixmultiplikation mit c wünschen, müssen Sie die Transponierung verwenden.

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