Python中矩阵的增量子集

Python中矩阵的增量子集,python,matrix,numpy,Python,Matrix,Numpy,我想增加矩阵的一小部分(变量)[下面的说明性代码]——但通过循环运行它们似乎很草率和不雅观——我怀疑这是进行此计算最慢的方法。 我的一个想法是创建另一个1的数组,我想增加的维度(下面的例子中为2x3),并用零填充这个临时数组,使其与原始数组具有相同的维度。然后我可以把它们加起来 不确定如何在numpy中完成此填充-或者这是否是执行此计算的最有效方法?我希望尽可能多地尝试和优化它 >>> import numpy as np >>> a = np.zer

我想增加矩阵的一小部分(变量)[下面的说明性代码]——但通过循环运行它们似乎很草率和不雅观——我怀疑这是进行此计算最慢的方法。 我的一个想法是创建另一个1的数组,我想增加的维度(下面的例子中为2x3),并用零填充这个临时数组,使其与原始数组具有相同的维度。然后我可以把它们加起来

不确定如何在
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.]])

您也可以通过以下方式来实现:

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

还可以使用逻辑阵列访问子集的各个元素。当子集的形状不规则时,特别方便

他们的表现也很好。比如说

In []: M= randn(2000, 2000)
In []: timeit M[M< 0]+= 10
1 loops, best of 3: 42.1 ms per loop
In[]:M=randn(20002000)
In[]:timeit M[M<0]+=10
1个回路,最佳3个:每个回路42.1毫秒

因此,对于相对较大的矩阵(2000 x 2000)来说,这似乎需要很长时间——我能用什么方法优化它?@flyingcrab。不幸的是,我不知道。也许可以在GPU上使用numpy。@flyingcrab:
timeit M[3:5,4:7]+=1
报告说,无论矩阵大小,它都需要
6.6
微秒。速度似乎取决于可用ram-我想这是瓶颈,atm timeit对我来说~1s@flyingcrab如果您的物理内存不足,那么没有太多需要优化的内容。然而2000x2000数组并不是很大,如果
M.dtype==dtype('float64')
那么
M.nbytes==32000000
。您可以使用较小的矩阵重定时,例如使用1000x1000,我的计时大约为
10ms
。因此,您可以粗略估计性能与元素的数量成线性关系。