2016-07-07 5 views
1

Ich habe einen csr_matrix, sagen wir, ich rief:Was ist der richtige Weg, Elemente zu einer CSR_Matrix hinzuzufügen?

import scipy.sparse as ss 
mat = ss.csr.csr_matrix((50, 100)) 

Jetzt möchte ich auf dieser Matrix einige der Werte ändern. Ich nenne:

mat[0,1]+=1 

Und ich bekomme:

SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. 

Ich brauche nur ein paar Werte (auf der Skala der Matrix endlich) zu setzen kurz nach der Gründung der Matrix. Später werde ich nur die Spalten lesen oder elementweise Operationen auf der ganzen Matrix durchführen (wie .log1p())

Was wäre der richtige Weg, das zu tun? Derzeit kann ich die Warnung einfach ignorieren, aber es gibt möglicherweise einen besseren Weg, der keine Warnung liefert.

+0

CSR und CSC sind die bevorzugten Formate für schnelle lineare Algebra-Berechnungen. Normalerweise erstellen Sie Ihre Matrix als COO, LIL oder DOK, wandeln sie nur einmal in CSC oder CSR um und machen dann die teure Mathematik daraus. Es würde helfen, Ihren Anwendungsfall besser zu verstehen: Was wollen Sie mit der Matrix machen? Müssen Sie zwischen teuren Vorgängen neue Daten hinzufügen oder können die Zusätze am Anfang gestapelt werden? – Jaime

+0

bearbeitet, ich hoffe es ist klarer. –

+0

Erstellen Sie eine [COO-Matrix] (http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.coo_matrix.html), fügen Sie die Werte hinzu und konvertieren Sie sie in a CSC- oder CSR-Matrix, wenn es einen Geschwindigkeitsvorteil für Ihre Operationen gibt. Wenn Sie elementare Operationen bevorzugen, ist der COO wahrscheinlich in Ordnung. Wenn Sie Spalten extrahieren möchten, wählen Sie CSC, wenn Zeilen CSR. – Jaime

Antwort

0

Sie können das Erscheinungsbild von Warnungen steuern. Der Standardwert ist, sie einmal während eines Laufs anzuzeigen und dann still zu sein. Sie können dies ändern, um einen Fehler zu melden, ganz still zu sein oder die Warnung jedes Mal ausgeben.

Eine gängige Methode zum Erstellen einer dünn besetzten Matrix besteht darin, die 3 coo Style-Arrays mit allen Werten ungleich Null zu erstellen. Dann machen Sie eine coo Matrix oder csr direkt (es dauert die gleiche Art der Eingabe).

coo Format hat keine Indizierung, so dass Sie M[i,j]=1 sowieso nicht tun können. Aber csr implementiert es. Ich denke, die Warnung ist da, um mehrere Änderungen (in einer Schleife) nicht ein oder zwei zu verhindern.

Die Änderung der Sparsity einer csr-Matrix erfordert die Neuberechnung des gesamten Satzes von Attributen (Daten- und Indexzeiger). Deshalb ist es teuer. Ich habe keine Timings gemacht, aber es kann fast so teuer sein, wie das Array frisch zu machen.

lil soll für inkrementelle Zuweisung besser sein. Es behält seine Daten in Listen von Listen und das Einfügen von Werten in Listen ist schnell. Aber die Konvertierung von csr zu lil und zurück braucht Zeit, also würde ich es nicht für ein paar Ergänzungen tun.

+0

Ich möchte nicht Warning Aussehen ändern, möchte ich die Dinge richtig machen. Momentan frage ich nicht, ob ich die Sparsity ändern könnte, aber es scheint, dass es trotzdem passiert, und ich frage mich warum. –

+0

Einige Formen der Hinzufügung können diese Warnung auch auslösen. – hpaulj

+0

Ich sehe das, aber ist es so schlimm, als wenn ich die ganze Matrix nicht zu spärlich reformieren würde oder ist es nur eine falsche Warnung? Die 3 Vektoren so zu machen, wie du es vorschlägst, ist eigentlich nicht so billig, also möchte ich nicht zu dem wechseln, wenn es die Dinge nicht besser macht. –