我需要为每个子矩阵求和。 例如,如果我有[[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矩阵
有人可以帮助我吗?没有重要包装!! `
答案 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)
因此,比您的要求快数千倍。