我有一个巨大的数组,我想用小数组计算点积。但我得到'阵列太大了'有解决方法吗?
import numpy as np
eMatrix = np.random.random_integers(low=0,high=100,size=(20000000,50))
pMatrix = np.random.random_integers(low=0,high=10,size=(50,50))
a = np.dot(eMatrix,pMatrix)
Error:
/Library/Python/2.7/site-packages/numpy/random/mtrand.so in mtrand.RandomState.random_integers (numpy/random/mtrand/mtrand.c:9385)()
/Library/Python/2.7/site-packages/numpy/random/mtrand.so in mtrand.RandomState.randint (numpy/random/mtrand/mtrand.c:7051)()
ValueError: array is too big.
答案 0 :(得分:2)
当计算数组的总大小时,如果它溢出了本机int类型see here以获取确切的源代码行,则会引发该错误。
为此,无论你的机器是64位,你几乎可以肯定运行32位版本的Python(和NumPy)。 You can check if that is the case by doing:
>>> import sys
>>> sys.maxsize
2147483647 # <--- 2**31 - 1, on a 64 bit version you would get 2**63 - 1
然后,你的数组是“仅”20000000 * 50 = 1000000000
,它位于2**30
之下。如果我尝试在32位numpy上重现您的结果,我会得到MemoryError
:
>>> np.random.random_integers(low=0,high=100,size=(20000000,50))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 1420, in mtrand.RandomState.random_integers (numpy\random\mtrand\mtrand.c:12943)
File "mtrand.pyx", line 938, in mtrand.RandomState.randint (numpy\random\mtrand\mtrand.c:10338)
MemoryError
除非我将尺寸增加到超出魔法2**31 - 1
阈值
>>> np.random.random_integers(low=0,high=100,size=(2**30, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 1420, in mtrand.RandomState.random_integers (numpy\random\mtrand\mtrand.c:12943)
File "mtrand.pyx", line 938, in mtrand.RandomState.randint (numpy\random\mtrand\mtrand.c:10338)
ValueError: array is too big.
鉴于你的追踪和我的线号不同,我怀疑你使用的是旧版本。这个输出在你的系统上是什么:
>>> np.__version__
'1.10.0.dev-9c50f98'
答案 1 :(得分:0)
我认为唯一的&#34;简单&#34;答案是获得更多的RAM。
花了15GB,但我能够在我的macbook上做到这一点。
In [1]: import numpy
In [2]: e = numpy.random.random_integers(low=0, high=100, size=(20000000, 50))
In [3]: p = numpy.random.random_integers(low=0, high=10, size=(50, 50))
In [4]: a = numpy.dot(e, p)
In [5]: a[0]
Out[5]:
array([14753, 12720, 15324, 13588, 16667, 16055, 14144, 15239, 15166,
14293, 16786, 12358, 14880, 13846, 11950, 13836, 13393, 14679,
15292, 15472, 15734, 12095, 14264, 12242, 12684, 11596, 15987,
15275, 13572, 14534, 16472, 14818, 13374, 14115, 13171, 11927,
14226, 13312, 16070, 13524, 16591, 16533, 15466, 15440, 15595,
13164, 14278, 13692, 12415, 13314])
可能的解决方案可能是使用sparse matrix和稀疏矩阵点运算符。
例如,在我的机器上构建仅e
作为密集矩阵使用8GB内存。构造一个类似的稀疏矩阵eprime
:
In [1]: from scipy.sparse import rand
In [2]: eprime = rand(20000000, 50)
在记忆方面的成本可以忽略不计。
答案 2 :(得分:0)
我相信答案是你没有足够的RAM,也可能你正在运行32位版本的python。也许澄清你正在运行的操作系统。许多操作系统将同时运行32位和64位程序。