3

我有一个大型 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_arrayfrom的内存占用input_array

4

2 回答 2

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))
于 2012-01-04T02:57:15.307 回答
2

这可能是使用 cython 可以减少内存使用的情况。您可以即时生成随机数并随时累积结果。我没有时间编写和测试完整的功能,但您肯定想randomkit在 c 级别使用(numpy 在后台使用的库)。

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

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

还可以在下面关于 cython 的论文中查看矩阵乘法是如何实现的:

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

与其将两个数组都作为输入,不如将input_array其作为一个,然后在方法中生成随机数组的小块。

对不起,如果它只是一个草图而不是实际代码,但希望它足以让你开始。

于 2012-01-04T02:17:25.237 回答