将大型稀疏矩阵转换为COO时出错

时间:2014-07-17 20:29:08

标签: python numpy scipy

我遇到了以下问题,尝试vstack两个大型CSR矩阵:

    /usr/lib/python2.7/dist-packages/scipy/sparse/coo.pyc in _check(self)
    229                 raise ValueError('negative row index found')
    230             if self.col.min() < 0:
--> 231                 raise ValueError('negative column index found')
    232
    233     def transpose(self, copy=False):

ValueError: negative column index found

我可以通过尝试将大的lil矩阵转换为coo矩阵来非常简单地重现此错误。以下代码适用于N = 10 ** 9但N = 10 ** 10时失败。

from scipy import sparse
from numpy import random
N=10**10
x = sparse.lil_matrix( (1,N) )
for _ in xrange(1000):
    x[0,random.randint(0,N-1)]=random.randint(1,100)

y = sparse.coo_matrix(x)

是否存在尺寸限制我正在使用合作矩阵?有没有解决的办法?

2 个答案:

答案 0 :(得分:6)

看起来你达到了32位整数的极限。这是一个快速测试:

In [14]: np.array([10**9, 10**10], dtype=np.int64)
Out[14]: array([ 1000000000, 10000000000])

In [15]: np.array([10**9, 10**10], dtype=np.int32)
Out[15]: array([1000000000, 1410065408], dtype=int32)

目前,大多数稀疏矩阵表示都假设32位整数索引,因此它们根本不能支持那么大的矩阵。

编辑:从版本0.14开始,scipy现在支持64位索引。如果你可以升级,这个问题就会消失。

答案 1 :(得分:5)

有趣的是,您的第二个示例在我的安装中运行良好。

错误消息“找到负列索引”听起来像是某处溢出。我检查了最新的来源,结果如下:

  • 实际索引数据类型在scipy.sparse.sputils.get_index_dtype
  • 中计算
  • 错误消息来自模块scipy.sparse.coo

例外来自这种代码:

    idx_dtype = get_index_dtype(maxval=max(self.shape))
    self.row = np.asarray(self.row, dtype=idx_dtype)
    self.col = np.asarray(self.col, dtype=idx_dtype)
    self.data = to_native(self.data)

    if nnz > 0:
        if self.row.max() >= self.shape[0]:
            raise ValueError('row index exceeds matrix dimensions')
        if self.col.max() >= self.shape[1]:
            raise ValueError('column index exceeds matrix dimensions')
        if self.row.min() < 0:
            raise ValueError('negative row index found')
        if self.col.min() < 0:
            raise ValueError('negative column index found')

这可能是一个明显的溢出错误 - 可能是 - 2 ** 31。

如果要调试它,请尝试:

import scipy.sparse.sputils
import numpy as np

scipy.sparse.sputils.get_index_dtype((np.array(10**10),))

它应该返回int64。如果它没有问题就在那里。

哪个版本的SciPy?