2016-12-21 11 views
1

私は、その後、すべての数値が150にインデックス100から始まり、送信元と送信先のnumpyの配列を持っている バッチ処理numpyの配列インデックス

dest = np.arange(1000) 
src = np.random(500) 

は、私が最初の50個の数字を上書きする配列destにSRC渡ってコピーしたいと言います、その後、200から250までというように900 950に

まで、私は以下を使用し、インデックス計算するには:

index = np.reshape([100*i+np.arange(50) for i in range(10)],-1) 

を、私はちょうど

を使用します
dest[index]=src 

残りの要素(別のSRCと、SRC2を言う)間でコピーする、私はちょうどことなく、私はこれを達成するための、よりエレガント/効率的な方法がありますかなり確信しているインデックス

index2 = np.reshape([50+100*i+np.arange(50) for i in range(10)],-1) 
dest[index2]=src2 

をadust明示的に索引を作成します。

コピーを実行するより良い方法はありますか?

答えて

1

dest.reshape(-1,50)[::2] = src.reshape(-1,50)

そしてsrc2用:

dest.reshape(-1,50)[1::2] = src2.reshape(-1,50)

1

私は最も簡単には行列

dest = dest.reshape((10, 100)) 
src = src.reshape((10, 50)) 

に両方を再形成し、行列のインデックスに

dest[:,:50] = src 
を使用することであろうと思います

destの100×10の行列を作成し、の代わりにの半分をsrcに置き換えて50×10の行列に変換することです。


Haminaaの答え@編集

はわずかに速いです。

%timeit dest.reshape((10, -1))[:,:50] = src.reshape((10, -1)) 

は最も遅い実行が最速よりも11.54倍の時間がかかりました。これは、 は、中間結果がキャッシュされていることを意味します。 1000000のループは、最高3の :ループあたり1.55マイクロ秒

%timeit dest.reshape(-1,50)[::2] = src.reshape(-1,50) 

最も遅い実行が最速よりも長く12.97倍を取りました。これは、 は、中間結果がキャッシュされていることを意味します。最高1000000個のループ、最高で 3個:ループあたり1.38μs

関連する問題