如何在scipy中创建一个巨大的稀疏矩阵

时间:2014-04-30 06:52:54

标签: python arrays numpy scipy sparse-matrix

我正在尝试创建一个非常庞大的稀疏矩阵,其形状为(447957347, 5027974)。 而且,它包含3,289,288,566个元素。

但是,当我使用csr_matrix创建scipy.sparse时,它会返回如下内容:

<447957346x5027974 sparse matrix of type '<type 'numpy.uint32'>'
    with -1005678730 stored elements in Compressed Sparse Row format>

创建矩阵的源代码是:

indptr = np.array(a, dtype=np.uint32)    # a is a python array('L') contain row index information
indices = np.array(b, dtype=np.uint32)   # b is  a python array('L') contain column index information
data = np.ones((len(indices),), dtype=np.uint32)
test = csr_matrix((data,indices,indptr), shape=(len(indptr)-1, 5027974), dtype=np.uint32)

而且,我发现当我将一个30亿长度的python数组转换为numpy数组时,它会引发一个错误:

ValueError:setting an array element with a sequence

但是,当我创建三个10亿个长度的python数组,并将它们转换为numpy数组时,然后追加它们。它工作正常。

我很困惑。

1 个答案:

答案 0 :(得分:9)

您使用的是旧版SciPy。在稀疏矩阵的原始实现中,索引存储在int32变量中,即使在64位系统上也是如此。即使你将它们定义为uint32,也就像你所做的那样,它们会被铸造出来。因此,只要您的矩阵具有超过2^31 - 1个非零条目,就像您的情况一样,索引会溢出并发生许多不好的事情。请注意,在您的情况下,奇怪的负数元素解释如下:

>>> np.int32(np.int64(3289288566))
-1005678730

好消息是,这已经被弄清楚了。我认为this是相关的PR,尽管在那之后还有一些更多的修复。在任何情况下,如果您使用latest release candidate作为SciPy 0.14,您的问题就应该消失。