在 scipy.sparse 中创建一个大型稀疏矩阵
Creating a large sparse matrix in scipy.sparse
我正在我的应用程序中使用 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
错误,我无法删除。
我知道我可以创建一个 10*n 乘 10*n 的矩阵,方法是创建一百个 n 乘 n 的矩阵,然后将它们堆叠在一起,但是,我认为 scipy.sparse
应该 能够处理大型稀疏矩阵的创建(我再说一遍,100k x 100k 绝不是大,scipy
处理具有几百万行的矩阵更舒服)。我错过了什么吗?
在不追根究底的情况下,您应该确保您在 Linux 平台上的 64 位架构上使用 64 位构建。在那里,本机 "long" 数据类型是 64 位大小(我相信与 Windows 相反)。
参考这些表格:
- http://www.unix.org/whitepapers/64bit.html(->long 在 LP64 上是 64 位)
- http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
编辑:
也许我之前不够明确——在 64 位 Windows 上,经典的本机 "long" 数据类型是 32 位大小(另请参阅 this 问题)。这 可能 是您的问题。也就是说,当您将平台更改为 Linux 时,您的代码可能会正常工作。我不能绝对肯定地说,因为它实际上取决于 numpy/scipy C 源代码中使用的本机数据类型(当然 Windows 上有 64 位数据类型可用,通常是平台案例分析是使用编译器指令执行的,并通过宏选择适当的类型——我真的无法想象他们会偶然使用 32 位数据类型。
编辑 2:
我可以提供三个数据样本来支持我的假设。
Debian 64 位,Python 2.7.3 和 SciPy 来自 Debian 存储库的 0.10.1 二进制文件:
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; print scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
0.10.1
(100000, 100000)
Windows 7 64 位,32 位 Python build,32 位 SciPy 0.10.1 build,both 来自 ActivePython:
ActivePython 2.7.5.6 (ActiveState Software Inc.) based on
Python 2.7.5 (default, Sep 16 2013, 23:16:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; print scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
0.10.1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\user\AppData\Roaming\Python\Python27\site-packages\scipy\sparse\construct.py", line 426, in rand
raise ValueError(msg % np.iinfo(tp).max)
ValueError: Trying to generate a random sparse matrix such as the product of dimensions is
greater than 2147483647 - this is not supported on this machine
Windows 7 64 位,64 位 ActivePython 构建,64 位 SciPy 0.15.1 构建(来自 Gohlke,针对 MKL 构建):
ActivePython 3.4.1.0 (ActiveState Software Inc.) based on
Python 3.4.1 (default, Aug 7 2014, 13:09:27) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
'0.15.1'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\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.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
错误,我无法删除。
我知道我可以创建一个 10*n 乘 10*n 的矩阵,方法是创建一百个 n 乘 n 的矩阵,然后将它们堆叠在一起,但是,我认为 scipy.sparse
应该 能够处理大型稀疏矩阵的创建(我再说一遍,100k x 100k 绝不是大,scipy
处理具有几百万行的矩阵更舒服)。我错过了什么吗?
在不追根究底的情况下,您应该确保您在 Linux 平台上的 64 位架构上使用 64 位构建。在那里,本机 "long" 数据类型是 64 位大小(我相信与 Windows 相反)。
参考这些表格:
- http://www.unix.org/whitepapers/64bit.html(->long 在 LP64 上是 64 位)
- http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
编辑: 也许我之前不够明确——在 64 位 Windows 上,经典的本机 "long" 数据类型是 32 位大小(另请参阅 this 问题)。这 可能 是您的问题。也就是说,当您将平台更改为 Linux 时,您的代码可能会正常工作。我不能绝对肯定地说,因为它实际上取决于 numpy/scipy C 源代码中使用的本机数据类型(当然 Windows 上有 64 位数据类型可用,通常是平台案例分析是使用编译器指令执行的,并通过宏选择适当的类型——我真的无法想象他们会偶然使用 32 位数据类型。
编辑 2:
我可以提供三个数据样本来支持我的假设。
Debian 64 位,Python 2.7.3 和 SciPy 来自 Debian 存储库的 0.10.1 二进制文件:
Python 2.7.3 (default, Mar 13 2014, 11:03:55)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; print scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
0.10.1
(100000, 100000)
Windows 7 64 位,32 位 Python build,32 位 SciPy 0.10.1 build,both 来自 ActivePython:
ActivePython 2.7.5.6 (ActiveState Software Inc.) based on
Python 2.7.5 (default, Sep 16 2013, 23:16:52) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; print scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
0.10.1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\user\AppData\Roaming\Python\Python27\site-packages\scipy\sparse\construct.py", line 426, in rand
raise ValueError(msg % np.iinfo(tp).max)
ValueError: Trying to generate a random sparse matrix such as the product of dimensions is
greater than 2147483647 - this is not supported on this machine
Windows 7 64 位,64 位 ActivePython 构建,64 位 SciPy 0.15.1 构建(来自 Gohlke,针对 MKL 构建):
ActivePython 3.4.1.0 (ActiveState Software Inc.) based on
Python 3.4.1 (default, Aug 7 2014, 13:09:27) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy; scipy.__version__; import scipy.sparse as s; s.rand(100000, 100000, 0.0001).shape
'0.15.1'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python34\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