2016-09-12 1 views
2

Ich entwickle Werkzeuge basierend auf Pandas DataFrame Objekte. Ich möchte Scipy Sparse-Matrizen als Spalte eines DataFrames herumführen, ohne sie zeilenweise in ein Listen-/Numy-Array von dtype ('O') zu konvertieren.Scipy spärlich Matrix als DataFrame Spalte

Das folgende Snippet funktioniert nicht, da Pandas die Matrix als Skalar behandeln und schlägt vor, einen Index hinzuzufügen. Wenn ein pd.RangeIndex über die Zeilenindizes in der Matrix gesetzt wird, wird die Matrix für jede Zeile im Datenrahmen wiederholt (da Pandas denkt, dass es ein Skalar ist).

ma = scipy.sparse.rand(10, 100, 0.1, 'csr', dtype=np.float64) 
df = pd.DataFrame(dict(X=ma)) 

Dies funktioniert:

df = pd.DataFrame(dict(X=list(ma))) 

Dies ist jedoch die Matrix zeilenweise in CSR-Matrizen mit jeweils 1 Zeile zerschneidet. Das würde ich dann jedesmal wieder einbauen müssen, wenn ich an der ursprünglichen Matrix arbeiten möchte.

Irgendwelche Zeiger? Ich habe versucht, die CSR-Matrix in ein pd.Series-Objekt zu verpacken, indem ich vorgab, dptype ('O') zu haben, aber ich habe viele Annahmen über die zugrundeliegenden Daten getroffen, bei denen es sich um numpige Arrays und dergleichen handelt.

Antwort

1

Es gibt ein Sparse-Datenframe- oder Dataseries-Feature. Es ist noch experimentell. Ich habe ein paar SO-Fragen über das Konvertieren zwischen diesen und scipy Sparse-Matrizen beantwortet.

in der Seitenleiste:

Populate a Pandas SparseDataFrame from a SciPy Sparse Coo Matrix

Ohne eine solche spezialisierte Pandas Struktur Ich sehe nicht, wie ein Sparse Matrix zu einem Pandas Rahmen hinzugefügt werden könnten. Die interne Struktur einer dünn besetzten Matrix ist zu verschieden. Für den Anfang ist es keine Unterklasse von numpy array.

Eine csr Matrix ist ein Objekt mit Daten in 3 Arrays, ma.data und ma.indices sind 1D Arrays mit einem Wert für jedes Element ungleich Null des Arrays. ma.indptr hat einen Wert für jede Zeile der Matrix.

list(ma) ist bedeutungslos. ma.toarray() erzeugt ein 2D-Array mit den gleichen Daten, und alle diese Nullen werden ebenfalls ausgefüllt.

Andere Sparse-Matrix-Formate speichern ihre Daten in anderen Strukturen - 3 gleiche Länge Arrays für coo, zwei Listen von Listen für lil, und ein Wörterbuch von dok.

+0

Danke @hpaulj für die Antwort. Ich bin eigentlich nicht daran interessiert, die SciPy-Matrix spaltenweise durch Pandas, nur zeilenweise oder die Matrix als Ganzes zu erreichen. Ich verstehe die Diskrepanz zwischen NDarray und den Sparse-Matrix-Typen auf einer Speicherlayout-Ebene. Ich hatte gehofft, dass es eine Abstraktion gab, in die beide passen konnten ... 'list (ma)' ist nicht bedeutungslos, zumindest für eine CSR-Matrix erstellt es CSR-Matrizen einer Reihe für jede Reihe in der ursprünglichen CSR-Matrix. –

+0

Ich sehe nicht, wie eine Matrix (2d), dicht oder sparse, als eine Spalte eines Dataframe verwendet werden kann. Ich glaube, Pandas werden versuchen, die Spalten eines 2D-Arrays auf eine gleiche Anzahl von Spalten abzubilden. Zellen können auch Objektzeiger, aber keine ganze Spalte sein. Aber ich kenne numpy und scipy besser als ich Pandas kenne. – hpaulj

+0

Danke nochmal. Ich verstehe. Wäre ein geeigneter Ort, um eine CSR-Matrix von Merkmalsvektoren zu speichern, wo eine Zeile z. ein Label in einer anderen Spalte des DataFrames und in der Lage zu sein, auf die zugrunde liegende CSR-Matrix zuzugreifen _ohne_ zu kopieren oder wieder zusammen zu stapeln. Ich kann nicht alles haben, denke ich :) –

Verwandte Themen