2011-01-29 85 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