gpt4 book ai didi

python - 数据向量列表的快速滚动求和(二维矩阵)

转载 作者:太空狗 更新时间:2023-10-30 00:49:47 26 4
gpt4 key购买 nike

我正在寻找一种快速计算滚动总和的方法,可能使用 Numpy。这是我的第一种方法:

 def func1(M, w):
Rtn = np.zeros((M.shape[0], M.shape[1]-w+1))
for i in range(M.shape[1]-w+1):
Rtn[:,i] = np.sum(M[:, i:w+i], axis=1)
return Rtn

M = np.array([[0., 0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 0., 0.],
[0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])

window_size = 4
print func1(M, window_size)

[[ 0. 0. 1. 2. 2. 3. 3. 3. 3. 2.]
[ 1. 2. 2. 1. 1. 0. 0. 0. 1. 2.]
[ 3. 2. 1. 1. 1. 1. 1. 1. 0. 0.]]

我想防止窗口 (/sum) 在循环中被重做,并希望让它更快,所以我想出了以下函数,它将总和限制为滚动窗口的第一个和最后一个元素:

 def func2(M, w):
output = np.zeros((M.shape[0], M.shape[1]-w+1))
sum = np.sum(M[:, 0:w], axis=1)
output[:,0] = sum

for i in range(w, M.shape[1]):
sum = sum + M[:,i]- M[:,i-w]
output[:,i-w+1] = sum
return output

但令我惊讶的是,func2 只比 func1 快一点:

 In [251]:
M = np.random.randint(2, size=3000).reshape(3, 1000)

window_size = 100
%timeit func1(M, window_size)
10 loops, best of 3: 20.9 ms per loop

In [252]:
%timeit func2(M, w)
10 loops, best of 3: 15.5 ms per loop

我是不是漏掉了什么?你们知道更好,我的意思是更快的方法来实现这一目标吗?

最佳答案

改编自@Jaime 的回答:https://stackoverflow.com/a/14314054/553404

import numpy as np

def rolling_sum(a, n=4) :
ret = np.cumsum(a, axis=1, dtype=float)
ret[:, n:] = ret[:, n:] - ret[:, :-n]
return ret[:, n - 1:]

M = np.array([[0., 0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 0., 0.],
[0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])

print(rolling_sum(M))

输出

[[ 0.  0.  1.  2.  2.  3.  3.  3.  3.  2.]
[ 1. 2. 2. 1. 1. 0. 0. 0. 1. 2.]
[ 3. 2. 1. 1. 1. 1. 1. 1. 0. 0.]]

时间

In [7]: %timeit rolling_sum(M, 4)
100000 loops, best of 3: 7.89 µs per loop

In [8]: %timeit func1(M, 4)
10000 loops, best of 3: 70.4 µs per loop

In [9]: %timeit func2(M, 4)
10000 loops, best of 3: 54.1 µs per loop

关于python - 数据向量列表的快速滚动求和(二维矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com