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ますか?

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/synapticarbors/pylangevin-integrator/blob/master/cIntegrator.pyx

また、次の cython に関する論文で行列乗算がどのように実装されているかを確認してください。

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

両方の配列を入力として持つ代わりに、input_array1 つだけにしてから、メソッドで、ランダムな配列の小さなチャンクを生成します。

これが実際のコードではなく単なるスケッチである場合は申し訳ありませんが、開始するのに十分であることを願っています。

于 2012-01-04T02:17:25.237 に答える