2013-07-23 14 views
27

Zauważyłem, że Pandy mają teraz support for Sparse Matrices and Arrays. Obecnie tworzę DataFrame() s tak:Wypełnij Pandas SparseDataFrame ze Spcse Matrix SciPy

return DataFrame(matrix.toarray(), columns=features, index=observations) 

Czy istnieje sposób, aby utworzyć SparseDataFrame() z scipy.sparse.csc_matrix() lub csr_matrix()? Konwersja do gęstego formatu bardzo źle zabija pamięć RAM. Dzięki!

+1

Obecnie API doświadczalna http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with-scipy- rzadki –

Odpowiedz

23

Bezpośrednia konwersja nie jest obsługiwana przez bankomat. Składki są mile widziane!

Spróbuj, powinno być ok na pamięci jako SpareSeries jest bardzo podobny do csc_matrix (1 kolumna) i dość miejsca wydajny

In [37]: col = np.array([0,0,1,2,2,2]) 

In [38]: data = np.array([1,2,3,4,5,6],dtype='float64') 

In [39]: m = csc_matrix((data,(row,col)), shape=(3,3)) 

In [40]: m 
Out[40]: 
<3x3 sparse matrix of type '<type 'numpy.float64'>' 
     with 6 stored elements in Compressed Sparse Column format> 

In [46]: pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) 
           for i in np.arange(m.shape[0]) ]) 
Out[46]: 
    0 1 2 
0 1 0 4 
1 0 0 5 
2 2 3 6 

In [47]: df = pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) 
            for i in np.arange(m.shape[0]) ]) 

In [48]: type(df) 
Out[48]: pandas.sparse.frame.SparseDataFrame 
+0

Awesome, thanks! Po prostu myślę głośno tutaj, ale skoro formaty SciPy Sparse są tak naprawdę tylko zbiorem danych i dwoma tablicami indeksów, czy moglibyśmy w jakiś sposób po prostu spekulować 'SparseDataFrame' tym? – Will

+4

jego najlepsze (w obecnej implementacji) do wypełnienia dla serii (kolumna); która następnie tworzy w zasadzie wewnętrzny indeks (nazywany indeksem indeksu) lub indeks blokowy (rodzaj podobny do bsr/csr) w celu zlokalizowania wartości. Jakiego rodzaju operacje zamierzasz wykonać? – Jeff

+0

Czy byłoby inaczej dla matrycy csr, czy jest to nadal zalecany sposób? – Sid

-10

Znacznie krótsza wersja:

df = pd.DataFrame(m.toarray()) 
+8

Niestety, 'toarray()' przekształca rzadką matrycę w gęstą matrycę i wykorzystuje śmieszne ilości pamięci. – Will

8

Jak pandy v 0.20.0 można użyć konstruktora SparseDataFrame.

Przykład z the pandas docs:

import numpy as np 
import pandas as pd 
from scipy.sparse import csr_matrix 

arr = np.random.random(size=(1000, 5)) 
arr[arr < .9] = 0 
sp_arr = csr_matrix(arr) 
sdf = pd.SparseDataFrame(sp_arr) 
Powiązane problemy