2016-04-14 3 views
1

Ich habe eine CSR_matrix 'A' Art von Sparse-Matrix. Ich möchte eine Operation ausführen, um eine neue csr_matrix 'b' zu erstellen, wobei jede Zeile von 'b' dieselbe Zeile von 'a' ist.Kacheloperation zum Erstellen einer CSR_Matrix aus einer Zeile einer anderen CSR_Matrix

Ich denke, für normale numpy Arrays ist es möglich mit "Kachel" -Operation. Aber ich kann nicht dasselbe für csr_matrix finden.

zunächst eine numpy Matrix zu machen und csr_matrix Umwandlung keine Option, da die Größe der Matrix 10000 x 10000.

Antwort

0

Es gibt ein blk Format, dass Sie eine neue Sparse Matrix aus einer Liste von anderen erstellen kann Matrizen.

So für einen Start konnte man

a1 = a[I,:] 
ll = [a1,a1,a1,a1] 
sparse.blk_matrix(ll) 

Ich habe nicht eine Shell dies zu testen läuft.

Intern wandelt dieses Format alle Eingabearrays in das Format coo um und sammelt ihre coo Attribute in 3 große Listen (oder Arrays). In Ihrem Fall von gekachelten Zeilen würden sich die Werte data und col (j) einfach wiederholen. Die row (I) Werte würden Schritt.

Eine andere Möglichkeit wäre, eine kleine Testmatrix zu erstellen und die Attribute zu betrachten. Welche Arten von Wiederholungen siehst du? Es ist einfach, Muster im coo Format zu sehen. lil könnte auch einfach zu replizieren sein, vielleicht mit der Liste *n Operation. csr ist schwieriger zu verstehen.

+0

schafft ll nicht eine ganze Menge Speicher nehmen gehen. Würde es nicht den Zweck besiegen, eine spärliche Matrix zu haben? – Naman

+0

Auch ich denke, ich könnte die Lösung erreichen, also habe ich es als Antwort hinzugefügt. Bitte schauen Sie, wenn Sie interessiert sind. – Naman

+1

Die 'csr' direkt zu erstellen wird etwas kompakter sein, da das 'indptr'-Attribut kürzer ist als die äquivalenten' coo' Zeilen. – hpaulj

0

Ich könnte tatsächlich zu beantworten, die keine vollständige numpy Matrix erstellen müssen und ist ziemlich schnell für meinen Zweck. So das Hinzufügen es als Antwort, wenn es für die Menschen in Zukunft nützlich ist:

rows, cols = a.shape 
b = scipy.sparse.csr_matrix((np.tile(a[2].data, rows), np.tile(a[2].indices, rows), 
          np.arange(0, rows*a[2].nnz + 1, a[2].nnz)), shape=a.shape) 

Diese zweite Reihe von ‚a‘ nimmt und Fliesen es ‚b‘ zu erstellen.

Im Folgenden ist der Timing-Test, scheint recht schnell für 10000x10000 Matrix:

100 loops, best of 3: 2.24 ms per loop 
+1

Ihre "Data" - und "Index" -Kacheln sind das, was ich für ein "coo" vorgeschlagen habe, aber Ihr 'indptr' ist kürzer als das, was' coo' erfordern würde. Die äquivalente Zeile "coo" würde etwas wie "np.arange (...). Repeat (nnz)", "[0,0..0,1,1 ..., 2,2 ...]" verwenden . – hpaulj

+0

Richtig, ich habe Ihre Lösung früher falsch verstanden. – Naman

Verwandte Themen