Numpy:利用随机数据减少点积的内存占用

时间:2012-01-04 00:22:29

标签: numpy memory-optimization dot-product

我有一个大的numpy数组,我将使用随机生成的值进行线性投影。

>>> input_array.shape
(50, 200000)
>>> random_array = np.random.normal(size=(200000, 300))
>>> output_array = np.dot(input_array, random_array)

不幸的是,random_array占用了大量内存,我的机器开始交换。在我看来,我实际上并不需要同时使用random_array全部;从理论上讲,我应该能够在点积计算过程中懒洋洋地生成它...但我无法弄清楚如何。

如何从output_array减少input_array计算的内存占用量?

2 个答案:

答案 0 :(得分:4)

这显然不是最快的解决方案,但您尝试过:

m, inner = input_array.shape
n = 300
out = np.empty((m, n))
for i in xrange(n):
    out[:, i] = np.dot(input_array, np.random.normal(size=inner))

答案 1 :(得分:2)

这可能是使用cython可能会减少内存使用量的情况。您可以动态生成随机数并随时累积结果。我没有时间编写和测试完整的函数,但你肯定想在c级使用randomkit(numpy在引擎盖下使用的库)。

您可以查看我为其他应用程序编写的一些示例代码,以了解如何包装randomkit:

https://github.com/synapticarbors/pylangevin-integrator/blob/master/cIntegrator.pyx

还要看看下面关于cython的文章中如何实现矩阵乘法:

http://conference.scipy.org/proceedings/SciPy2009/paper_2/full_text.pdf

不要将两个数组作为输入,只需将input_array作为一个,然后在方法中,随机生成随机数组的小块。

很抱歉,如果它只是草图而不是实际代码,但希望它足以让您入门。