首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy stride_tricks.as_strided与滚动窗口的列表理解

numpy stride_tricks.as_strided与滚动窗口的列表理解
EN

Stack Overflow用户
提问于 2016-07-04 14:15:57
回答 1查看 5.6K关注 0票数 6

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

代码语言:javascript
复制
[np.std(x[i:i+framesize]) for i in range(0, len(x)-framesize, hopsize)])]

最近我发现了numpy.lib.stride_tricks.as_strided,发现它被广泛用于滚动窗口(例如,这个职位),尽管它是一个“隐藏”函数。

本期中,关于为什么stride_tricks.as_strided是无文档的,有人提到

故意的!太危险了!它只是帮助实现broadcast_arrays()的低级管道。

stride_tricks.as_strided比列表理解或for循环有什么优势吗?我看了一下stride_tricks,但收获甚微。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-07 12:28:11

this post中,我们可以使用strided_app将滑动视图基本输入到数组中,它还允许我们指定hopsize/逐步大小。然后,我们简单地沿着第二个轴使用np.std作为最终输出,如下所示-

代码语言:javascript
复制
np.std(strided_app(x, framesize, hopsize), axis=1)

样本运行以进行验证-

代码语言:javascript
复制
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])

作为输入数组中的视图,这些跨越式操作必须是真正有效的。把它找出来!

运行时测试

胡说八道-

代码语言:javascript
复制
def loopy_app(x, framesize, hopsize):
    return [np.std(x[i:i+framesize]) \
        for i in range(0, len(x)-framesize+1, hopsize)]

时间安排-

代码语言:javascript
复制
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

因此,要用strides回答关于效率的问题,时间应该有助于证明一点!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38186869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档