我正在尝试从稀疏的numpy矩阵创建SparseSeries列表。创建lil_matrix很快并且不会占用大量内存(实际上我的维度大约为数百万,即1500万个样本和400万个特征)。我已经阅读了之前的topic。但是这个解决方案似乎也耗尽了我的所有记忆,冻结了我的电脑。在表面看起来像大熊猫SparseSeries不是真的稀疏,或者我做错了什么?最终目标是从中创建一个SparseDataFrame(就像我提到的其他主题一样)。
from scipy.sparse import lil_matrix, csr_matrix
from numpy import random
import pandas as pd
nsamples = 10**5
nfeatures = 10**4
rm = lil_matrix((nsamples,nfeatures))
for i in xrange(nsamples):
index = random.randint(0,nfeatures,size=4)
rm[i,index] = 1
l=[]
for i in xrange(nsamples):
l.append(pd.Series(rm[i,:].toarray().ravel()).to_sparse(fill_value=0))
答案 0 :(得分:1)
由于您的目标是稀疏数据帧,我跳过Series
阶段并直接进入数据帧。我只有耐心才能在较小的阵列尺寸上做到这一点:
nsamples = 10**3
nfeatures = 10**2
创建rm
是一样的,但我不会加载到列表中,而是执行此操作:
df = pd.DataFrame(rm[1,:].toarray().ravel()).to_sparse(0)
for i in xrange(1,nsamples):
df[i] = rm[i,:].toarray().ravel()
遗憾的是,这比你拥有的要慢得多,但结果是数据框,而不是列表。我玩了一下这一点,我可以告诉你,没有任何快速的方法可以逐列构建一个大的,稀疏的数据帧(甚至是一个完整的零),而不是一次性完成(这不会是内存)有效)。我可以找到的文档中的所有示例都以密集结构开始,然后一步转换为稀疏。
无论如何,这种方式应该通过一次压缩一列来实现内存效率,这样你就不会同时解压缩整个数组/数据帧。结果数据帧肯定是稀疏的:
In [39]: type(df)
Out[39]: pandas.sparse.frame.SparseDataFrame
并且绝对节省空间(几乎25倍压缩):
In [40]: df.memory_usage().sum()
Out[40]: 31528
In [41]: df.to_dense().memory_usage().sum()
Out[41]: 800000