Was ist der Schnellste Weg, um schneiden Sie ein scipy.sparse-matrix?
Verwende ich normalerweise
matrix[:, i:]
Scheint es nicht so schnell arbeiten, wie ich es erwartet habe.
- Sinn des benchmarking ist es für uns? vielleicht sogar
timeit
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine sparse-matrix, die Ausgabe der Schnellste Weg, um Zeilen schneiden, ist eine
csr
geben, und für Spalten schneidencsc
, wie hier beschrieben. In beiden Fällen müssen Sie nur das zu tun, was Sie gerade tun:Wenn Sie möchten, eine andere Art als Ausgang gibt es vielleicht schnellere Wege. In dieser anderen Antwort es erklärt viele Methoden, die für das schneiden von einer matrix und Ihrer unterschiedlichen timings im Vergleich. Zum Beispiel, wenn Sie möchten, eine
ndarray
als Ausgabe die Schnellste slicing:oder:
viel schneller als:
Habe ich gefunden, dass das angekündigte schnelle Zeile Indizierung von
scipy.sparse.csr_matrix
gemacht werden kann, viel schneller, indem Sie Ihre eigenen Rollen Reihe indexer. Hier ist die Idee:Ist, ist es möglich zu nutzen, um die schnelle Indizierung der numpy-arrays durch die Speicherung der nicht-null-Werte jeder Zeile in separate arrays (mit einer anderen Länge für jede Zeile) und Stelle alle diese Zeilen-arrays in ein Objekt-Typ-array (so dass jede Zeile eine andere Größe), die indiziert werden können, effizient. Die Spalte Indizes gespeichert werden, auf die gleiche Weise. Der Ansatz ist etwas anders als die standard CSR-Daten-Struktur, die speichert alle nicht-null-Werte in einem array erfordert look-ups, um zu sehen, wo jede Zeile beginnt und endet. Diese look-ups können verlangsamen random access, sollte aber effizient für den Abruf von zusammenhängenden Zeilen.
Profiling-Ergebnisse
Meine matrix
mat
ist eine von 1.900,000x1,250,000csr_matrix
mit 400,000,000 nicht-null-Elemente.ilocs
ist ein array von 200.000 zufällige Zeilen-Indizes.gegenüber:
Den SparseRowIndexer scheint schneller zu sein als mit fancy indexing im Vergleich zu booleschen Masken.