numpy中巨大数组的点积

时间:2014-09-05 14:21:34

标签: python numpy

我有一个巨大的数组,我想用小数组计算点积。但我得到'阵列太大了'有解决方法吗?

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.

3 个答案:

答案 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位程序。