我目前正在尝试制作一个非常大的矩阵,我不确定如何以内存有效的方式这样做。
我试图使用numpy,这适用于我的小盒子(2750086X300) 但是,我得到了一个更大的,2750086X1000,这对我来说太大了。
我虽然想要使用整数,但我会为它添加浮动值,因此不确定该cld如何影响它。
我尝试了一些关于制作稀疏零填充数组的内容,但是cldnt在这里或其他地方找到了任何很棒的主题/问题/建议。
有人有什么好建议吗?我目前正在使用python,所以我有点寻找pythonic解决方案,但我愿意尝试其他语言。
THX
编辑:
对于建议,我试过scipy.sparse.csr_matrix,它设法创建了一个矩阵,但却大大增加了通过它的时间。继承人我正在做的事情:
matrix = scipy.sparse.csr_matrix((df.shape[0], 300))
## matrix = np.zeros((df.shape[0],
for i, q in enumerate(df['column'].values):
matrix[i, :] = function(q)
其中function几乎是该行的向量运算函数。
现在,如果我在np.zeros上进行循环,它很容易实现,大约10分钟。
现在,如果我尝试使用scipy稀疏矩阵进行相同操作,则需要大约50个小时。这不合理。
有任何建议吗?
编辑2:
scipy.sparse.lil_matrix做了伎俩
循环大约需要20分钟,并且使用比np.zeros更少的内存
THX。
编辑3:
仍然记忆力昂贵。决定不在矩阵上存储数据。一次处理1行。从中获取相关的价值/指标,将价值存储在原始df,再次运行。答案 0 :(得分:4)
from scipy.sparse import *
from scipy import *
a=csr_matrix( (2750086,1000), dtype=int8 )
然后a
是
<2750086x1000 sparse matrix of type '<class 'numpy.int8'>'
with 0 stored elements in Compressed Sparse Row format>
例如,如果你这样做:
from scipy.sparse import *
from scipy import *
a=csr_matrix( (5,4), dtype=int8 ).todense()
print(a)
你得到:
[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]
另一种选择是使用scipy.sparse.lil_matrix
a = scipy.sparse.lil_matrix((2750086,1000), dtype=int8 )
这似乎更有效地设置元素(如a[1,1]=2
)。