gpt4 book ai didi

python - 一维 NumPy 数组上的滑动标准差

转载 作者:行者123 更新时间:2023-12-03 20:18:23 46 4
gpt4 key购买 nike

假设您有一个数组并想创建另一个数组,该数组的值连续等于第一个数组的 10 个元素的标准差。在 for 循环的帮助下,它可以像下面的代码一样轻松编写。我想要做的是避免使用 for 循环来加快执行时间。有什么建议?

Code
a = np.arange(20)
b = np.empty(11)
for i in range(11):
b[i] = np.std(a[i:i+10])

最佳答案

您可以使用 np.lib.stride_tricks.as_strided 创建一个二维滑动窗口数组。那将是对给定 1D 的 View 数组,因此不会占用更多内存。然后,只需使用 np.std 沿着第二个轴(轴 = 1)以矢量化方式获得最终结果,就像这样 -

W = 10 # Window size
nrows = a.size - W + 1
n = a.strides[0]
a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,W),strides=(n,n))
out = np.std(a2D, axis=1)
运行时测试
函数定义 -
def original_app(a, W):
b = np.empty(a.size-W+1)
for i in range(b.size):
b[i] = np.std(a[i:i+W])
return b

def vectorized_app(a, W):
nrows = a.size - W + 1
n = a.strides[0]
a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,W),strides=(n,n))
return np.std(a2D,1)
时间和验证 -
In [460]: # Inputs
...: a = np.arange(10000)
...: W = 10
...:

In [461]: np.allclose(original_app(a, W), vectorized_app(a, W))
Out[461]: True

In [462]: %timeit original_app(a, W)
1 loops, best of 3: 522 ms per loop

In [463]: %timeit vectorized_app(a, W)
1000 loops, best of 3: 1.33 ms per loop
所以,在 附近400x 在那里加速!
为了完整起见,这是等效的 Pandas 版本-
import pandas as pd

def pdroll(a, W): # a is 1D ndarray and W is window-size
return pd.Series(a).rolling(W).std(ddof=0).values[W-1:]

关于python - 一维 NumPy 数组上的滑动标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40773275/

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