我遇到了以下问题,尝试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)
是否存在尺寸限制我正在使用合作矩阵?有没有解决的办法?
答案 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?