如何对子矩阵求和

时间:2018-10-30 15:52:41

标签: python matrix time sum submatrix

我需要为每个子矩阵求和。 例如,如果我有[[1,1,2],[2,3,4]],则结果矩阵将为:

 M[0][0] = 1 M[0][1] = 1+1 = 2 M[0][2] = 1+1+2 = 4
 M[1][0] = 1+2 = 3 M[1][1] = 1+1+2+3 = 7 M[1][2] = 1+1+2+2+3+4 = 13

M = [[1,2,4],[3,7,13]]

我编写了这段代码

`N = []
 M = []
 summ = 0
 n= list(map(int, input().split()))
 while n != []:
     N.append(n)
     n = list(map(int, input().split()))
 for i in range(len(N)):
     M.append([0 for i in range(len(N[0]))])
     summ = 0
     for j in range(len(N[0])):
         summ += N[i][j]
         M[i][j] = M[i-1][j] + summ ` 

问题在于,当矩阵很大时,会变慢。 我需要在0.5秒内最多解决100x100矩阵

有人可以帮助我吗?没有重要包装!! `

1 个答案:

答案 0 :(得分:0)

为了提高速度,您真的想使用NumPy,除了为矩阵提供更简洁的代码外,它比基本的Python还要快得多。在您的小示例中,您可以在不同的轴上两次使用numpy.cumsum()

import numpy as np

arr = np.array([[1,1,2],[2,3,4]])
out = arr.cumsum(axis=1).cumsum(axis=0)

print(out)

礼物:

array([[ 1,  2,  4],
       [ 3,  7, 13]], dtype=int32)

旁注:在Windows上,默认的int类型为32位,而cumsum()可能会在大型矩阵/大型数上无提示地溢出,因此,如果启用,则可能需要arr = np.array([[1,1,2],[2,3,4]]).astype(np.int64) Windows。

时间:

arr = np.arange(10000).reshape(100, 100)
%timeit out = arr.cumsum(axis=1).cumsum(axis=0)
56.3 µs ± 4.96 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

因此,比您的要求快数千倍。