sparse
verwendet Matrixmultiplikation, um Zeilen wie diese auszuwählen. Ich habe die Details der extractor
-Matrix in einer anderen SO-Frage ausgearbeitet, aber grob um eine (p, n) -Matrix von einer (m, n) -Matrix zu erhalten, muss sie eine (p, m) -Matrix verwenden (mit Nicht-Null-Werten)).
Die Matrixmultiplikation selbst ist ein 2-Pass-Prozess. Der erste Durchgang bestimmt die Größe der resultierenden Matrix.
Im Gegensatz zu dichten numpy
-Arrays gibt das Sharse-Matrix-Slicing niemals eine Ansicht zurück.
Sparse matrix slicing using list of int
hat Details über die Extraktionsmatrix. Ich schlage auch vor, csr.sum(axis=1)
zu testen, da auch das Matrixmultiplikation verwendet.
def extractor(indices, N):
indptr=np.arange(len(indices)+1)
data=np.ones(len(indices))
shape=(len(indices),N)
return sparse.csr_matrix((data,indices,indptr), shape=shape)
So erfordert jede zweite Zeile der Indizierung:
in Ihrem Beispiel
In [99]: M = sparse.random(100,80,.1, 'csr')
In [100]: M
Out[100]:
<100x80 sparse matrix of type '<class 'numpy.float64'>'
with 800 stored elements in Compressed Sparse Row format>
In [101]: E = extractor(np.r_[1:100:2],100)
In [102]: E
Out[102]:
<50x100 sparse matrix of type '<class 'numpy.float64'>'
with 50 stored elements in Compressed Sparse Row format>
In [103]: M1 = E*M
In [104]: M1
Out[104]:
<50x80 sparse matrix of type '<class 'numpy.float64'>'
with 407 stored elements in Compressed Sparse Row format>
Ihre Matrix selbst nur 22MB (Werte) + einig aux-Material ist, wahrscheinlich <80 MB Speicher. Also bist du sicher, das ist die Quelle deines Problems (etwas anderes auf deinem Server benutzt wahrscheinlich 39 GB Speicher)? (und das Schneiden spärlicher Matrizen wird übrigens eine Kopie erzeugen) – sascha
(1) Diese Scheibe nimmt jedes Element nach dem anderen, beginnend mit dem zweiten Element (ungerade Elemente). (2) Server hat viele docker fcontainer und andere wartende Prozesse, die alle zusammen 40 GB dauern –