Python 从SciPy稀疏矩阵填充一个SPARAFRAME

Python 从SciPy稀疏矩阵填充一个SPARAFRAME,python,numpy,scipy,pandas,sparse-matrix,Python,Numpy,Scipy,Pandas,Sparse Matrix,我注意到熊猫现在已经长大了。目前,我创建了DataFrame()s,如下所示: return DataFrame(matrix.toarray(), columns=features, index=observations) 是否有一种方法可以使用scipy.sparse.csc_matrix()或csr_matrix()创建sparsataframe()?转换为密集格式会严重破坏RAM。谢谢 ATM不支持直接转换。欢迎捐款 试试这个,在内存上应该可以,因为SpareSeries很像csc_矩

我注意到熊猫现在已经长大了。目前,我创建了
DataFrame()
s,如下所示:

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

是否有一种方法可以使用
scipy.sparse.csc_matrix()
csr_matrix()
创建
sparsataframe()
?转换为密集格式会严重破坏RAM。谢谢

ATM不支持直接转换。欢迎捐款

试试这个,在内存上应该可以,因为SpareSeries很像csc_矩阵(1列) 而且非常节省空间

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
[37]中的
:col=np.数组([0,0,1,2,2,2])
在[38]中:data=np.array([1,2,3,4,5,6],dtype='float64')
在[39]中:m=csc_矩阵((数据,(行,列)),形状=(3,3))
In[40]:m
出[40]:
在[46]中:pd.SparseSeries([pd.SparseSeries(m[i].toarray().ravel())
对于np.arange中的i(m.shape[0]))
出[46]:
0  1  2
0  1  0  4
1  0  0  5
2  2  3  6
在[47]中:df=pd.SparseSeries([pd.SparseSeries(m[i].toarray().ravel())
对于np.arange中的i(m.shape[0]))
In[48]:类型(df)
Out[48]:pandas.sparse.frame.sparaframe

更简短的版本:

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

从pandas v 0.20.0开始,您可以使用
sparaFrame
构造函数

例如:

将numpy导入为np
作为pd进口熊猫
从scipy.sparse导入csr_矩阵
arr=np.random.random(大小=(1000,5))
arr[arr<.9]=0
sp_arr=csr_矩阵(arr)
sdf=pd.SPARAFRAME(sp_arr)

太棒了,谢谢!在这里,我只是想大声说出来,但是由于SciPy稀疏格式实际上只是一个数据数组和两个索引数组,我们是否可以用它来计算
SPARSTAFRAME
?最好(在当前的实现中)填充每个系列(列);然后基本上创建一个内部索引(称为int索引)或块索引(类似于bsr/csr)来定位值。你想做什么样的操作?对于csr矩阵,这会有所不同吗?或者这仍然是推荐的方法吗?Jeff,在我的例子中,使用这种方法不会节省内存,调用
df.memory\u usage().sum()
与我刚才创建的数据帧一样:
pd.dataframe(mtx.todense())
。但是,如果我在这里将
添加到\u sparse
方法
pd.DataFrame(mtx.todense())。添加到\u sparse(fill\u value=0)
并再次调用
df.memory\u usage().sum()
,它会更少。也许这很容易回答,但我有点卡住了。不太确定你在做什么,这是一个相当旧的版本。尝试使用较新的熊猫,如果不是,请打开一个问题/SO问题。不幸的是,
toarray()
将稀疏矩阵转换为密集矩阵,并使用了大量内存。这是一个简单而简短的代码,对于我相对较小的数据集,内存消耗是一个可接受的折衷。现在有一个实验性API:
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)