2017-02-23 2 views
2

Ich habe eine sehr große spärlich csc_matrixx. Ich möchte elementwise exp() darauf anwenden. Grundsätzlich möchte ich das gleiche Ergebnis erhalten, wie ich es mit numpy.exp(x.toarray()) bekommen hätte. Aber ich kann das nicht (mein Speicher erlaubt mir nicht, die dünn besetzte Matrix in ein Array umzuwandeln). Gibt es einen Ausweg? Danke im Voraus!Element weise exp() von scipy spärlich Matrix

+0

Wenn Sie die Eingabe nicht im dichten Format halten können, können Sie die Ausgabe nicht halten. Die Ausgabe wird nicht spärlich sein, da e^0 = 1 ist. – user2357112

Antwort

5

Wenn Sie nicht über den Speicher x.toarray() verfügen, haben Sie nicht den Speicher, um die Ausgabe zu halten, die Sie fordern. Die Ausgabe wird nicht spärlich sein; in der Tat, es sei denn, Ihre Eingabe negativ Unendlichkeiten in sich hat, wird der Ausgang wohl keine hat einzelne 0.

Es wäre wahrscheinlich besser exp (x) -1, zu berechnen, die als

so einfach ist
x.expm1() 
+0

Ja, du hast Recht. Aber wie kann ich es dann nur für Nicht-Null-Werte tun? –

+1

Was ist das? Sparse-Matrizen enthalten alle numpigen Funktionen, die als Mitglieder Null auf Null abbilden. Es gibt ein Feature, das ich nicht erwartet hätte! –

+0

Ja, 'scipy/sparse/data.py' hat einen Code-Block, der' # Fügt die numpy unary ufuncs hinzu für die func (0) = 0 to _data_matrix.'. Der Schlüssel ist der Zugriff auf das '.data'-Attribut und das Erstellen einer neuen Matrix mit einer' _with_data'-Methode. Das war mir auch nicht bewusst. – hpaulj

3

Wenn Sie etwas nur auf Nicht-Nullen tun möchten: Das Attribut data ist zumindest in einigen Darstellungen beschreibbar, einschließlich csr und csc. Einige Darstellungen ermöglichen doppelte Einträge, also stellen Sie sicher, dass Sie auf einem "normalisierten" Formular handeln.

+0

Ja, daran habe ich gedacht. Jedenfalls werde ich mir die Hände schmutzig machen! –

0

Um Nicht-Null Elemente zu ändern, vielleicht wäre dies für Sie arbeiten:

x = some big sparse matrix 
np.exp(x.data, out=x.data) # ask np.exp() to store results in existing x.data 

vermutlich langsamer:

# above seems more efficient (no new memory alloc). 
x.data = np.exp(x.data) 

Ich habe mit gerungen, wie ein um eine elementweise log2() jedes Nicht-Null-Array-Elements. Ich landete tun smth wie:

np.log2(x.data, out=x.data) 

Die folgenden beiden Techniken scheinen genau das, was ich gesucht habe. Meine Matrix ist spärlich, aber es gibt immer noch viele Nicht-Null-Elemente.

Kredit zu @DSM here für die Idee, x.data direkt zu ändern, ich denke, das ist ein großartiger Einblick über dünn besetzte Matrizen.

Kredit an @Mike Müller für die Idee, "out" als sich selbst zu verwenden. Im selben Thread, @kmario23 weist darauf hin, eine wichtige Einschränkung über die Förderung .data zu schweben (Eingaben könnten int oder smth sein), so dass es mit der .exp() oder was auch immer Funktion kompatibel ist, würde ich das tun wollen, wenn ich smth schrieb für den allgemeinen Gebrauch.

Hinweis: Ich fange gerade an, über spärliche Matrizen zu lernen, also würde ich gerne wissen, ob dies eine schlechte Idee für Gründe ist, die ich nicht sehe. Bitte lassen Sie es mich wissen, wenn ich damit auf dünnem Eis bin.

Normalerweise würde ich nicht mit privaten Attributen stören, aber .data zeigt ziemlich klar in attributes documentation für die verschiedenen dünn besiedelten Matrizen, die ich angeschaut habe.

Verwandte Themen