2017-08-05 8 views
0

行列X (1000x10)と行列Y (20x10)を持っています。効率的にを(20x10)ブロックのブロックXに繰り返し追加します(したがって50ブロック)。 numpyでこれを行う効率的な方法はありますか? np.repeatを元の行列が巨大で、不要な重複を防ぐためにYを使用したいとは思いません。何か案は?Numpyは別の行列のスライスに行列を加えます

答えて

2

あなたが操作を実行するargument list unpackingNumPy broadcastingthe fact that ndarray.reshape() returns a viewを活用することができます

tmp = X.reshape(-1, *Y.shape) 
tmp += Y 

追加のデータが割り当てられていないと、これらの操作の後、Xされます操作の結果が含まれます。

+1

違いは、 'X.reshape()+ Y'を計算すると新しい配列が割り当てられ、' tmp + = Y'はすでに割り当てられている値を変更します。追加のRAMは割り当てられません。そして、 'X'は形を変えないので、出力は正しい形になります。 –

+0

入手しました。ありがとう。 –

+0

うわー!これは私にとって魔法に見えます!どのように機能するのですか? '* Y.shape'は何かを説明できますか? 'X.reshape(-1、* Y.shape)'が 'X'を' tmp'にコピーしないのはなぜですか? ( 'X'と似ていますか?)ありがとうございました! – Babak

0

あなたが「拡大」するnp.tileを使用することができます。これは一時的な大規模な配列のメモリ内に作成されます

x = np.zeros([1000,10]) 
y = np.ones([20,10]) 
new_x = x + np.tile(y,(50,1)) 

例えば(より正確に、タイル)より大きな配列のサイズに合わせて、より小さな配列、 xに追加してください。すぐに破棄されますので、メモリ容量とアレイのサイズによって異なりますが、CPU使用率と可読性の面で最も効率的です。

もう1つの選択肢はもちろん、より大きなアレイをループし、そのすべての部分(この場合は50回)にブロードキャストしますが、CPUの方が時間がかかり、効率は低くなりますが、記憶が軽い

第二オプションの例:

for i in range(0,len(x),20): 
    x[i:i+20,:] = y 
関連する問題