2016-06-28 9 views
0

私はPythonで作業していますが、問題が発生しました。サブ配列をコピーできるように、巨大な配列(21 x 2000 x 4000行列)を初期化する必要があります。 問題は、リアルタイムアプリケーションのため、実際には速くしたいが、numpy.ones((21,2000,4000))を実行すると、この行列を作成するのに約1分かかります。 numpy.zeros((21,2000,4000))を実行すると瞬時になりますが、サブマトリックスをコピーするとすぐに1分かかりますが、最初のケースではコピー部分が瞬間的でした。大きな行列をnumpyで長時間初期化する

巨大な配列を高速に初期化する方法はありますか?

+0

*巨大な*ここにあなたのキーワードは、あなたがそれを行うに関係なく、168万ポイントを設定するので、ちょうど良いことをちょうど1回行う... –

+0

私は違いは、 'numpy.zeros 'は実際の行列よりも軽い行列です。したがって、それをコピーすると、実際の行列が作成されます。実際の行列は、巨大な行列(168Mセル)であるため、1分かかります。このような次元の行列をより早く初期化する方法はないと思います。 – ysearka

答えて

1

私は速い方法がないと思います。構築している行列はかなり大きく(8バイトのfloat64 x 21 x 2000 x 4000 = 1.25 GB)、システムの物理メモリの大部分を使い果たしている可能性があります。したがって、待っている1分は、オペレーティングシステムが部屋を作るために他のものをページアウトする必要があるためかもしれません。割り当てを行いながらメモリ使用量とページングを監視している間に、topなど(System Monitorなど)を見て確認できます。

numpy.zerosは、メモリがOSによって遅延的に割り当てられているため、瞬時に呼び出されるようです。ただし、OSを使用しようとすると、OSは実際にそのデータをどこかに収めなければなりません。 Why the performance difference between numpy.zeros and numpy.zeros_like?

大きな行列を作成せずに、コピーしようとしている部分行列のみを作成できるようにコードを再構成できますか?

+0

ご清聴いただきありがとうございます。巨大な行列を使わないことは不可能かもしれません。これは、21のチャンネルを持つ大きな画像です(実際に深い学習ではピクセル単位のラベル付けのためにlogits/probabilityを持つ21のカテゴリです)。 サブマトリクスはニューラルネットワークの出力であり、レイヤーの入力ストライドサイズに依存します。 –

+0

この場合、@CSᵠによれば、入力する前にマトリックスをどこかにあらかじめ割り当てることができるかもしれませんアプリケーションのリアルタイムループに追加します。割り当てられたメモリを常に再使用するように気を付けることができれば、1分だけ待つだけで済みます。 – wildwilhelm

+0

もし私があなたが 'float64'を割り当てていることを前提にしていれば、' dtype'を変更することもできます。 'float32'を使うと640 MBしか必要ないでしょう。 – wildwilhelm

関連する問題