2012-01-04 10 views
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_arrayの計算のメモリフットプリントをinput_arrayからどのように減らすことができますか?

+0

は、これは単純化された例である、またはあなたが実際に正規分布乱数の大規模な配列の中に点在していますか? 'random_array'が生成される方法は関連しているかもしれません。 –

+0

@DavidZaslavsky単純な例ではありません。これはまさに私がやりたいことです。 'random_array'の生成の変化を可能にする方法は、ボーナスですが、必須ではありません。 –

+0

これを利用して遊ぶことができるとは確信できません。 'np.dot'はすべての入力のサイズ(2Dドット積==行列乗算)を知る必要があります。どのような場合でも 'np.dot'でジェネレータを使用する(簡単な)方法はありません。 – Yuushi

答えて

4

明らかにこれは最速の解決策はありませんが、試してみました:

​​
+0

ありがとうございます。なぜこの合理的なアプローチが私には起きなかったのか分かりません。 :)それは間違いなく高速です...しかし、私の場合は、それは許容されるトレードオフです。 –

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の回避策で十分だと思うが、これは私の袖を持って良いです。 –

関連する問題