Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy stride_技巧。与滚动窗口的列表理解相比_Python_Arrays_Numpy_Stride - Fatal编程技术网

Python numpy stride_技巧。与滚动窗口的列表理解相比

Python numpy stride_技巧。与滚动窗口的列表理解相比,python,arrays,numpy,stride,Python,Arrays,Numpy,Stride,在处理滚动窗口时,我以列表理解的方式编写函数 [np.std(x[i:i+framesize]) for i in range(0, len(x)-framesize, hopsize)])] 最近我发现了numpy.lib.stride\u技巧。as\u stride发现它被广泛用于滚动窗口(例如),尽管它是一个“隐藏”函数 关于为什么stride_.as_strided没有文档记录,有人提到 故意的!这很危险!它只是帮助实现广播数组()的低级管道 stride\u技巧有什么优势吗?as\u

在处理滚动窗口时,我以列表理解的方式编写函数

[np.std(x[i:i+framesize]) for i in range(0, len(x)-framesize, hopsize)])]
最近我发现了
numpy.lib.stride\u技巧。as\u stride
发现它被广泛用于滚动窗口(例如),尽管它是一个“隐藏”函数

关于为什么stride_.as_strided没有文档记录,有人提到

故意的!这很危险!它只是帮助实现广播数组()的低级管道

stride\u技巧有什么优势吗?as\u stride
超过了列表理解或for循环?我看了一下,但收获甚微。

从中,我们可以使用
跨步应用程序
基本上将滑动视图放入阵列中,它还允许我们指定跳跃大小/步长。然后,我们只需沿着第二个轴使用
np.std
作为最终输出,如下所示-

np.std(strided_app(x, framesize, hopsize), axis=1)
样本运行以进行验证-

In [162]: x = np.random.randint(0,9,(11))

In [163]: framesize = 5

In [164]: hopsize = 3

In [165]: np.array([np.std(x[i:i+framesize]) \
            for i in range(0, len(x)-framesize+1, hopsize)])
Out[165]: array([ 1.62480768,  2.05912603,  1.78885438])

In [166]: np.std(strided_app(x, framesize, hopsize), axis=1)
Out[166]: array([ 1.62480768,  2.05912603,  1.78885438])
作为输入数组的视图,这些快速操作必须非常有效。让我们来看看吧

运行时测试

循环方法-

def loopy_app(x, framesize, hopsize):
    return [np.std(x[i:i+framesize]) \
        for i in range(0, len(x)-framesize+1, hopsize)]
时间安排-

In [185]: x = np.random.randint(0,9,(1001))

In [186]: framesize = 5

In [187]: hopsize = 3

In [188]: %timeit loopy_app(x, framesize, hopsize)
10 loops, best of 3: 17.8 ms per loop

In [189]: %timeit np.std(strided_app(x, framesize, hopsize), axis=1)
10000 loops, best of 3: 111 µs per loop

因此,为了回答关于效率的问题,用
步幅
,计时应该有助于证明这一点

最近的
split
问题可能部分回答了您的问题。被接受的答案使用列表理解,我的答案大步走。我向大家展示了它是如何“不停地”访问值的。嗨@Divakar很抱歉,我没有做任何测试。这是一篇老文章,我记得我使用了
strips
而不是列表理解作为最终解决方案。