2012-01-04 128 views
3

我有一個大的numpy數組,我將使用隨機生成的值進行線性投影。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;在理論上,我應該能夠在點積計算過程中產生它,但我無法弄清楚如何。

如何從input_array減少計算output_array的內存佔用量?

+0

這是一個簡單的例子,或者是你實際上點綴成一個大陣正態分佈的隨機數的?產生'random_array'的方式可能是相關的。 – 2012-01-04 00:31:19

+0

@DavidZaslavsky不是一個簡單的例子 - 這正是我想要做的。一種允許變化「random_array」的方法是一種獎勵,但不是必需的。 – 2012-01-04 00:34:18

+0

有一個玩弄這個,我不知道這是可能的 - 'np.dot'需要知道所有輸入的大小(作爲二維點積==矩陣乘法)。在任何情況下,我都看不到在'np.dot'中使用生成器的(簡單)方法。 – Yuushi 2012-01-04 01:22:14

回答

4

這顯然不是最快的解決方案,但你嘗試過:

​​
+0

謝謝;不知道爲什麼這種明智的做法沒有發生在我身上。 :)這絕對不是快......但在我的情況下,這是一個可以容忍的權衡。 – 2012-01-04 18:54:50

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爲一體,然後在該方法中,產生小塊隨機數組的隨機數。

對不起,如果它只是一個草圖而不是實際的代碼,但希望它足以讓你開始。

+0

這是一個很好的答案 - 非常有用的指針。我認爲在短期內,@ Bago的解決方法已經足夠了,但這對我來說是件好事。 – 2012-01-04 18:56:13