2014-10-07 204 views
2

我需要在numpy/scipy中迭代构建一个巨大的稀疏矩阵。该intitialization是一个循环中完成:巨大的python稀疏矩阵

from scipy.sparse import dok_matrix, csr_matrix 

def foo(*args): 
    dim_x = 256*256*1024 
    dim_y = 128*128*512 
    matrix = dok_matrix((dim_x, dim_y))  

    for i in range(dim_x): 
     # compute stuff in order to get j 
     matrix[i, j] = 1. 
    return matrix.tocsr() 

那么我需要因为进一步的计算类似的将其转换为一个csr_matrix,:

matrix = foo(...) 
result = matrix.T.dot(x) 

这是工作的罚款开始。但是我的矩阵越来越大,我的电脑开始崩溃。在存储矩阵中有更优雅的方法吗?

基本上我有以下要求:

  • 的矩阵需要存储浮点值形式0.〜1
  • 我需要计算矩阵的转置
  • 我需要计算点积与x_dimensional矢量
  • 矩阵尺寸可以是大约1 * 10^9×1 * 10^8

我夯存储超过。我正在读堆栈溢出和其他互联网上的几篇文章;)我发现PyTables,这不是真正的矩阵计算...等等。有没有更好的方法?

+0

我认为这可能是更多的数学/数值分析问题:)在我的Num.Anal。当然,做这种大小的矩阵的唯一方法是使它成为三角形。 – 2014-10-07 03:23:51

+0

另外,我知道你要求的是numpy,但是我有一个有点完成的python库。 [这是在github上](https:// github。com/Twoody/Lin_Alg_py) – 2014-10-07 03:26:11

+0

当你问这个问题时,看起来你想存储浮动块,但是你接受了一个提示int的答案。我只是好奇 - 我在这里错过了什么?谢谢! – 2016-02-21 20:20:30

回答

2

您可能已经达到了Python可以为您做的极限,或者您可能可以做更多一点。尝试设置np.float32的数据类型,如果您位于64位计算机上,则精度降低可能会降低您的内存消耗。 np.float16可以帮助你记忆,甚至进一步,但你的计算速度可能会变慢(我见过的例子,其中处理可能需要10倍的时间量):

matrix = dok_matrix((dim_x, dim_y), dtype=np.float32)  

或可能慢得多,甚至可能不如内存消耗:

matrix = dok_matrix((dim_x, dim_y), dtype=np.float16)  

另一种选择:购买更多的系统内存。


最后,如果你能避免dok_matrix创建矩阵,可以与csr_matrix而不是创建它(我不知道这是可能你的计算),你可以保存在字典有点开销dok_matrix使用。

2

对于你的情况我建议你使用的数据类型np.int8(或np.uint8),这需要每个元素只有一个字节:

matrix = dok_matrix((dim_x, dim_y), dtype=np.int8) 

直接构建csr_matrix也将让你与矩阵最大规模走得更远:

from scipy.sparse import csr_matrix 

def foo(*args): 
    dim_x = 256*256*1024 
    dim_y = 128*128*512 
    row = [] 
    col = [] 

    for i in range(dim_x): 
     # compute stuff in order to get j 
     row.append(i) 
     col.append(j) 
    data = np.ones_like(row, dtype=np.int8) 

    return csr_matrix((data, (row, col)), shape=(dim_x, dim_y), dtype=np.int8)