2011-01-29 6 views
2

行列の小さな部分(変数)をインクリメントしたいのですが(ループの例題を参照してください)、ループを使ってループを実行するのはちょっと面白くないようです。この計算を行う。 私が持っていたアイディアの1つは、インクリメント(2x3以下の例で)し、この一時的な配列を0で埋め込んで元のサイズと同じ次元にする次元の別の配列を作成することでした。私はそれらを合計することができます。Pythonの行列の部分集合を増やす

numpyでこのパディングを実行する方法がわからない場合、またはそれがこの計算を実行する最も効果的な方法である場合は、私はできるだけこれを試して最適化したいと思います。

>>> import numpy as np  
>>> a = np.zeros((10,10)) 
>>> for i in range(3,5): 
...  for x in range(4,7): 
...   a[i][x] += 1 
>>> a 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 

答えて

7

あなたは、単にで同じことを行うことができます:あなたは、あなたのサブセットの個々の要素にアクセスするためにも、論理的配列を使用することができます

a[3:5,4:7] += 1 
+0

笑、これは恥ずかしいです。ありがとうございました! – malangi

+0

これは、比較的大きな行列(2000 x 2000)で長い時間がかかりそうです - これを最適化できる方法は何ですか? – malangi

+0

@flyingcrab。残念ながら私は知らない。おそらく、GPUでnumpyを使用することは可能です。 – Marcin

1

。あなたのサブセットが不規則な形をしている場合に特に便利です。

また、非常によく機能します。たとえば、

In []: M= randn(2000, 2000) 
In []: timeit M[M< 0]+= 10 
1 loops, best of 3: 42.1 ms per loop 
+0

それは速度が利用可能なラムにかなり偶然であるように見えます - 私はボトルネックだと思います、atm私のためのtimeit〜1秒! – malangi

+0

@flyingcrab物理メモリが不足している場合は、最適化することはあまりありません。しかし、2000x2000配列は 'M.dtype == dtype( 'float64')'、 'M.nbytes == 32000000'のように実際にはそれほど大きくありません。小さなマトリクスでリタイムすることができます。例えば、1000x1000のタイミングでは、「10ms」前後です。したがって、パフォーマンスは要素の数に線形に依存すると大まかに見積もることができます。 – eat

関連する問題