Numpy:使用随机数据减少dot产品的内存占用

Numpy:使用随机数据减少dot产品的内存占用,numpy,memory-optimization,dot-product,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占用了大量内存,我的机器开始交换。在我看来,我实际上并不需要

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

>>> input_array.shape
(50, 200000)
>>> random_array = np.random.normal(size=(200000, 300))
>>> output_array = np.dot(input_array, random_array)
不幸的是,
random_array
占用了大量内存,我的机器开始交换。在我看来,我实际上并不需要所有的
随机数组同时出现;从理论上讲,我应该能够在点积计算期间懒洋洋地生成它……但我不知道如何生成


如何从
input\u array
减少
output\u array
计算的内存占用?

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

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

在下面关于cython的文章中,还可以了解矩阵乘法是如何实现的:

不要将两个数组都作为输入,只需将
input\u array
作为一个数组,然后在方法中,在执行时生成随机数组的小块


抱歉,如果它只是一个草图而不是实际的代码,但希望它足以让您开始。

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

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))

这是一个简化的例子,还是你实际上是在一个正态分布随机数的大数组中打点?生成
随机_数组的方式可能是相关的。@DavidZaslavsky不是一个简化的例子——这正是我想要做的。一种允许在生成
随机_数组时发生变化的方法是一种额外的方法,但不是必需的。我不确定这是否可能-
np。dot
需要知道其所有输入的大小(如2D点积==矩阵乘法)。在任何情况下,我都看不到在
np.dot
中使用生成器的(简单)方法。这不是你的问题,但200k值的总和不是非常正态分布的吗?你怎么能超越中心极限定理?@Yuushi是的,这需要一些惰性计算数组的概念(包括形状等元数据),其中的值不是查找而是动态计算的。计算可能必须看起来像(非常波浪状)
Rij=基于种子的随机(全局随机种子,i,j)
;不知道为什么我没有想到这种明智的做法。:)这肯定不是很快……但在我的例子中,这是一个可以接受的权衡。这是一个很好的答案——非常有用的指针。我认为在短期内,@Bago的解决方案就足够了,但这对我来说是件好事。