内存有效的方法来制作大的零矩阵python

时间:2017-04-06 23:28:20

标签: python performance numpy memory scipy

我目前正在尝试制作一个非常大的矩阵,我不确定如何以内存有效的方式这样做。

我试图使用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,再次运行。

1 个答案:

答案 0 :(得分:4)

尝试scipy.sparse.csr_matrix

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)。