2011-01-29 36 views
2

我想增加一個矩陣的小部分(變量)[下面的說明代碼] - 但是在循環中運行它們看起來是草率和不雅 - 我懷疑是最慢的方法做這個計算。 我的想法之一是創建另一個我想要增加的維度數組(例如下面的2x3),並用零填充這個臨時數組,以便它與原始維數相同。然後我可以將它們相加。在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 2011-01-29 09:20:33

+0

所以這似乎需要很長時間在相對較大的矩陣(2000 x 2000) - 通過任何方式我可以優化? – malangi 2011-01-29 09:51:26

1

您還可以使用邏輯陣列訪問您的子集的各個元素。當你的子集具有不規則的形狀時特別方便。

他們的表現也很好。例如

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