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