Angenommen, ich habe ein 2d Sparse-Array. In meiner realen usecase sowohl die Anzahl der Zeilen und Spalten sind viel größer (etwa 20000 und 50000) kann daher nicht in dem Speicher passen, wenn eine dichte Darstellung verwendet wird:Wie man eine scipy.sparse-Matrix elementweise mit einem gesendeten dichten 1d-Array multipliziert?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
Jetzt nimmt ich einen dichten 1d Array mit allen nicht-Nullen-Komponenten mit einer Größe von 3 (oder 50000 in meinem wirklichen Leben Fall):
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
ich mag das element Multiplikation von a berechnen, und d die üblichen Sende Semantik von numpy verwenden. Jedoch schwach besetzte Matrizen in scipy sind der np.matrix: der ‚*‘ Operator überlastet ist, um es wie eine Matrix-Multiplikation verhalten zu haben, anstatt die elemente multiplizieren:
>>> a * d
array([ 0., -3., 0., 0., 6.])
Eine Lösung wäre, zu machen " ein‘Schalter auf die Array-Semantik für den‚*‘Operator, das wäre das erwartete Ergebnis geben:
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
Aber ich kann das nicht tun, da der Anruf(), um toArray die dichte Version materialisieren würde‚a‘die passt nicht in den Speicher (und das Ergebnis wird auch dicht):
>>> ssp.issparse(a.toarray())
False
Haben Sie eine Idee, wie Sie dies erstellen können, während Sie nur wenig Datenstrukturen speichern und keine uneffiziente Python-Schleife für die Spalten von 'a' erstellen müssen?
Wenn 'd' eine spärliche Matrix mit der gleichen Größe wie' a' Sie können 'verwenden a.multiply (d)'. Vielleicht kannst du ein "d" machen, das N Zeilen lang ist und über N Reihen von 'a' gleichzeitig kreisen? – mtrw
Aber d ist dicht und kann nicht explizit im Speicher übertragen werden, um die Anforderungen an die Mehrfachform zu erfüllen. Schleifen über eine Charge ist eine Option, aber ich finde das ein bisschen hackish. Ich hätte gedacht, dass es eine vektorisierte/scipy Vanilleart gab, ohne eine Pythonschleife zu tun. – ogrisel
Ich vermute, das Problem ist, dass Sie die Darstellung einer (spärlichen) Matrix wollen, aber die multiple Operation eines Arrays. Ich denke, dass du dich leider selbst rollen musst. – mtrw