【发布时间】:2015-04-25 22:38:07
【问题描述】:
我在我的应用程序中使用scipy.sparse 并想做一些性能测试。为此,我需要创建一个大型稀疏矩阵(然后我将在我的应用程序中使用它)。只要矩阵很小,我可以使用命令创建它
import scipy.sparse as sp
a = sp.rand(1000,1000,0.01)
这会产生一个 1000 x 1000 的矩阵,其中包含 10.000 个非零条目(合理的密度意味着每行大约有 10 个非零条目)
问题是当我尝试创建一个更大的矩阵时,例如,一个 100.000 x 100.000 的矩阵(我之前处理过 way 个更大的矩阵),我运行
import scipy.sparse as sp
N = 100000
d = 0.0001
a = sp.rand(N, N, d)
这应该会产生一个 100.000 x 100.000 的矩阵,其中包含一百万个非零条目(在可能的范围内),我收到一条错误消息:
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
sp.rand(100000,100000,0.0000001)
File "C:\Python27\lib\site-packages\scipy\sparse\construct.py", line 723, in rand
j = random_state.randint(mn)
File "mtrand.pyx", line 935, in mtrand.RandomState.randint (numpy\random\mtrand\mtrand.c:10327)
OverflowError: Python int too large to convert to C long
这是我无法删除的一些恼人的内部scipy 错误。
我知道我可以通过创建一百个 n x n 矩阵然后将它们堆叠在一起来创建一个 10*n x 10*n 矩阵,但是,我认为scipy.sparse 应该能够处理大型稀疏矩阵的创建(我再说一遍,100k x 100k 绝不是大的,scipy 可以轻松地处理数百万行的矩阵)。我错过了什么吗?
【问题讨论】:
-
这可能是因为它通过选择介于 0 和
N*M之间的32 bit int和最大 32 位(有符号)整数来选择 随机 条目来提供矩阵是2^31-1(100,000*100,000 = 10,000,000,000 > 2,147,483,647 = 2^31-1)。使用bmat在块中构建它可能是最简单的解决方法。尝试制作N*M = 2^31-2然后2^31看看是否会导致问题弹出。 -
我无法再编辑之前的评论,但该错误与我所描述的一致:
Python int too large to convert to C long和 climits 标头中的限制。 -
这可能只发生在 32 位 Python 上,这可能就是为什么之前没有注意到这个错误。
-
正如 Jan-Philip Gehrcke 在下面指出的那样,它取决于系统 - 我认为您应该能够在您的系统上查看
stdint.h并查看您的限制。
标签: python numpy matrix scipy sparse-matrix