这里有各种方法以及一些基准。 最好的方法是使用来自其他库的优化代码的版本。 bottleneck.move_mean方法可能是最好的方法。 scipy.convolve方法也非常快速,可扩展,并且在语法和概念上都很简单,但是对于很大的窗口值来说,缩放效果并不理想。 如果您需要纯粹的numpy方法,那么numpy.cumsum方法很好。

注意:其中一些(例如bottleneck.move_mean )未居中,将会移动您的数据。

import numpy as np

import scipy as sci

import scipy.signal as sig

import pandas as pd

import bottleneck as bn

import time as time

def rollavg_direct(a,n):

'Direct "for" loop'

assert n%2==1

b = a*0.0

for i in range(len(a)) :

b[i]=a[max(i-n//2,0):min(i+n//2+1,len(a))].mean()

return b

def rollavg_comprehension(a,n):

'List comprehension'

assert n%2==1

r,N = int(n/2),len(a)

return np.array([a[max(i-r,0):min(i+r+1,N)].mean() for i in range(N)])

def rollavg_convolve(a,n):

'scipy.convolve'

assert n%2==1

return sci.convolve(a,np.ones(n,dtype='float')/n, 'same')[n//2:-n//2+1]

def rollavg_convolve_edges(a,n):

'scipy.convolve, edge handling'

assert n%2==1

return sci.convolve(a,np.ones(n,dtype='float'), 'same')/sci.convolve(np.ones(len(a)),np.ones(n), 'same')

def rollavg_cumsum(a,n):

'numpy.cumsum'

assert n%2==1

cumsum_vec = np.cumsum(np.insert(a, 0, 0))

return (cumsum_vec[n:] - cumsum_vec[:-n]) / n

def rollavg_cumsum_edges(a,n):

'numpy.cumsum, edge handling'

assert n%2==1

N = len(a)

cumsum_vec = np.cumsum(np.insert(np.pad(a,(n-1,n-1),'constant'), 0, 0))

d = np.hstack((np.arange(n//2+1,n),np.ones(N-n)*n,np.arange(n,n//2,-1)))

return (cumsum_vec[n+n//2:-n//2+1] - cumsum_vec[n//2:-n-n//2]) / d

def rollavg_roll(a,n):

'Numpy array rolling'

assert n%2==1

N = len(a)

rolling_idx = np.mod((N-1)*np.arange(n)[:,None] + np.arange(N), N)

return a[rolling_idx].mean(axis=0)[n-1:]

def rollavg_roll_edges(a,n):

# see https://stackoverflow.com/questions/42101082/fast-numpy-roll

'Numpy array rolling, edge handling'

assert n%2==1

a = np.pad(a,(0,n-1-n//2), 'constant')*np.ones(n)[:,None]

m = a.shape[1]

idx = np.mod((m-1)*np.arange(n)[:,None] + np.arange(m), m) # Rolling index

out = a[np.arange(-n//2,n//2)[:,None], idx]

d = np.hstack((np.arange(1,n),np.ones(m-2*n+1+n//2)*n,np.arange(n,n//2,-1)))

return (out.sum(axis=0)/d)[n//2:]

def rollavg_pandas(a,n):

'Pandas rolling average'

return pd.DataFrame(a).rolling(5, center=True, min_periods=1).mean().to_numpy()

def rollavg_bottlneck(a,n):

'bottleneck.move_mean'

return bn.move_mean(a, window=n, min_count=1)

N = 10**6

a = np.random.rand(N)

functions = [rollavg_direct, rollavg_comprehension, rollavg_convolve,

rollavg_convolve_edges, rollavg_cumsum, rollavg_cumsum_edges,

rollavg_pandas, rollavg_bottlneck, rollavg_roll, rollavg_roll_edges]

print('Small window (n=3)')

%load_ext memory_profiler

for f in functions :

print('\n'+f.__doc__+ ' : ')

%timeit b=f(a,3)

print('\nLarge window (n=1001)')

for f in functions[0:-2] :

print('\n'+f.__doc__+ ' : ')

%timeit b=f(a,1001)

print('\nMemory\n')

print('Small window (n=3)')

N = 10**7

a = np.random.rand(N)

%load_ext memory_profiler

for f in functions[2:] :

print('\n'+f.__doc__+ ' : ')

%memit b=f(a,3)

print('\nLarge window (n=1001)')

for f in functions[2:-2] :

print('\n'+f.__doc__+ ' : ')

%memit b=f(a,1001)

定时,小窗口(n = 3)

Direct "for" loop :

4.14 s ± 23.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

List comprehension :

3.96 s ± 27.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

scipy.convolve :

1.07 ms ± 26.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

scipy.convolve, edge handling :

4.68 ms ± 9.69 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

numpy.cumsum :

5.31 ms ± 5.11 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

numpy.cumsum, edge handling :

8.52 ms ± 11.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Pandas rolling average :

9.85 ms ± 9.63 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

bottleneck.move_mean :

1.3 ms ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Numpy array rolling :

31.3 ms ± 91.9 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Numpy array rolling, edge handling :

61.1 ms ± 55.9 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

大窗口计时(n = 1001)

Direct "for" loop :

4.67 s ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

List comprehension :

4.46 s ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

scipy.convolve :

103 ms ± 165 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

scipy.convolve, edge handling :

272 ms ± 1.23 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

numpy.cumsum :

5.19 ms ± 12.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

numpy.cumsum, edge handling :

8.7 ms ± 11.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Pandas rolling average :

9.67 ms ± 199 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

bottleneck.move_mean :

1.31 ms ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

内存,小窗口(n = 3)

The memory_profiler extension is already loaded. To reload it, use:

%reload_ext memory_profiler

scipy.convolve :

peak memory: 362.66 MiB, increment: 73.61 MiB

scipy.convolve, edge handling :

peak memory: 510.24 MiB, increment: 221.19 MiB

numpy.cumsum :

peak memory: 441.81 MiB, increment: 152.76 MiB

numpy.cumsum, edge handling :

peak memory: 518.14 MiB, increment: 228.84 MiB

Pandas rolling average :

peak memory: 449.34 MiB, increment: 160.02 MiB

bottleneck.move_mean :

peak memory: 374.17 MiB, increment: 75.54 MiB

Numpy array rolling :

peak memory: 661.29 MiB, increment: 362.65 MiB

Numpy array rolling, edge handling :

peak memory: 1111.25 MiB, increment: 812.61 MiB

内存,大窗口(n = 1001)

scipy.convolve :

peak memory: 370.62 MiB, increment: 71.83 MiB

scipy.convolve, edge handling :

peak memory: 521.98 MiB, increment: 223.18 MiB

numpy.cumsum :

peak memory: 451.32 MiB, increment: 152.52 MiB

numpy.cumsum, edge handling :

peak memory: 527.51 MiB, increment: 228.71 MiB

Pandas rolling average :

peak memory: 451.25 MiB, increment: 152.50 MiB

bottleneck.move_mean :

peak memory: 374.64 MiB, increment: 75.85 MiB

python 移动平均值_python - 如何使用NumPy计算移动平均值? - 堆栈内存溢出相关推荐

  1. python 欧氏距离_python - 如何用NumPy计算欧氏距离?

    我想用各种性能说明来阐述简单的答案. np.linalg.norm可能比您需要的更多: dist=numpy.linalg.norm(a-b) 首先 - 此功能旨在处理列表并返回所有值,例如 比较中距 ...

  2. python array太慢_python - gdal ReadAsarray对于vrt非常慢 - 堆栈内存溢出

    迟到了,但这是我根据Rutger的优秀答案写的剧本. 它以某种方式优化了磁贴大小,以便您可以读取最少的块. 这几乎肯定不是你能做的最好的,但我注意到它在处理大小为[1440000 560000]的地理 ...

  3. python json文件太大_python - python json.dump创建的文件太大 - 堆栈内存溢出

    所以我有这个CSV文件,大小为380 MB左右. 我为此创建了一个空数据结构:{ID1 {day1:[[flow,hour1],[flow,hour2] ... [flow,hour23]],day2 ...

  4. python求移动平均_如何用NumPy计算移动平均值?

    NumPy缺少特定于域的函数可能是由于核心团队的纪律性和对NumPy主指令的忠实性:提供了N维数组类型,以及创建和索引这些数组的函数.像许多基本目标一样,这个目标并不小,纽比做得很出色. 更大的Sci ...

  5. python中与six有关的whl_pandas - 在升级numpy,six和python-dateutil时,无法使用pip来安装pandas - 堆栈内存溢出...

    在升级numpy和pytho-dateutil我无法使用pip来安装pandas . 经过几次尝试,我认为问题在于pip默认安装路径. 如何解决此问题并成功安装pandas ? Python 2.7已 ...

  6. numpy计算移动平均值

    1.简单移动平均值 简单移动平均线(simple moving average)通常用于分析时间序列上的数据.假设我们知道某个月的每日股票收盘价,现在我们来计算N个交易日股票收盘价的移动平均值. &g ...

  7. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释

    总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Python.所以本文作为一个记录&笔记,文章内容大多数取自网络以&官网快速入门等, ...

  8. python 欧氏距离_如何用NumPy计算欧氏距离?

    对于任何对同时计算多个距离感兴趣的人,我做了一些比较完成图(我的一个小项目).结果证明a_min_b = a - b numpy.sqrt(numpy.einsum('ij,ij->i', a_ ...

  9. python求协方差矩阵_用numpy计算协方差(covariance)

    numpy.cov函数计算协方差(covariance),不过函数返回的是一个对称矩阵.协方差的数学定义如下: 协方差(covariance) numpy.cov函数在输入1D数据的时候,等于是在计算 ...

最新文章

  1. LTE QCI分类 QoS
  2. 视觉稿与H5页面之间的终端适配
  3. 高温保护_连续4天高温预警!高温作业,这些劳动保护知识一定要懂!
  4. iOS开发CoreAnimation解读之四——Layer层动画内容
  5. KVM创建虚拟机(六)
  6. Java线程知识整理汇总
  7. figma设计_一种在Figma中跟踪设计迭代的简单方法
  8. 防反射JavaScript –如何让您的JS等待
  9. 2010年下半年软件评測师(下午)试题分析与解答
  10. 服务器新手装备无限拿指令,【新手指南】服务器指令大全
  11. 如果Mac无法连接到其他电脑共享怎么办?
  12. 现代操作系统 第三章 内存管理 习题答案
  13. [2014]兄弟连高洛峰 php教程5.5.1,2014PHP兄弟连全套教程
  14. Python入门(3)
  15. html thead隐藏,HTML的thead标签
  16. 局部特征——角点检测(Harris,Shi-Tomasi)
  17. 365地图java_中国气候区划在线地图(1:3200万)
  18. matlab动态图阿基米德螺旋,魔兽世界M基尔加丹阿基米德螺旋线之Matlab动图!国服加油...
  19. java 句柄无效_Java开发网 - java.io.IOException: 句柄无效???
  20. 用Python批量把EXCEL表格中的数据提交到网页上

热门文章

  1. 大众宣布成立欧洲公司 负责旗下电动汽车电池业务
  2. 2022翼支付产业合作解决方案发布 权益累计发展用户超1.36亿
  3. 微博月活跃用户数增至5.73亿 移动端用户占比达94%
  4. 继爱奇艺之后,腾讯视频、优酷宣布:取消剧集超前点播服务
  5. “阿里女员工被侵害”案最新进展:两人涉嫌强制猥亵
  6. 索尼斥资11.7亿美元收购AT&T动漫业务Crunchyroll
  7. 连CEO都不香了?这些互联网大佬接连辞任
  8. 刘作虎:一加 8 系列新品将加入无线充电功能
  9. 征集“战疫”中的影像力量 第六届中国无人机影像大赛开始报名
  10. 共享单车变“私有”、被毁、被盗:用户们都看不下去了,举报!