1

我的数据由时间数组组成,每秒有 10 个数据点,以及与每次对应的强度值数组。因此,例如,假设我有:

times = np.arange(0,100,0.1)
intensities = np.random.rand(len(times))

我想看看如果我使用更长的平均时间,数据会是什么样子,所以我想创建一些箱,比如 1 秒、5 秒和 10 秒,并对这些新箱中的强度值进行平均。在 numpy 中执行此操作的最佳方法是什么?(或其他 python 包,但我假设 numpy/scipy 对我有用。)我可以使用 for 循环,但我希望有更好的方法。谢谢!

4

2 回答 2

6

您可以使用此处convolve的 stackoverflow 中提到的方法计算移动平均值。

from pylab import plot, show
import numpy as np

times = np.arange(0,100,0.1)
intensities = np.random.rand(len(times))

def window(size):
    return np.ones(size)/float(size)

plot(times,intensities,'k.')
plot(times,np.convolve(intensities,window(10),'same'),'r')
plot(times,np.convolve(intensities,window(100),'same'),'b')
show()

在此处输入图像描述

于 2013-04-11T22:56:24.677 回答
4

您可以重新调整数据以将其分组为 10、50 或 100 组。然后调用该mean(axis=-1)方法在最后一个轴(大小为 10、50 或 100 的轴)上取平均值:

使用此设置:

In [10]: import numpy as np

In [11]: times = np.linspace(0,100,1000)

In [12]: intensities = np.random.rand(len(times))

这是每 10 个值的平均值:

In [13]: intensities.reshape(-1,10).mean(axis=-1)
Out[13]: <output omitted due to length>

每 50 个值的平均值:

In [14]: intensities.reshape(-1,50).mean(axis=-1)
Out[14]: <output omitted due to length>

每 100 个值的平均值:

In [15]: intensities.reshape(-1,100).mean(axis=-1)
Out[15]: 
array([ 0.50969463,  0.5095131 ,  0.52503152,  0.49567742,  0.52701341,
        0.53584475,  0.54808964,  0.47564486,  0.490907  ,  0.50293636])

arr.reshape(-1, 10)告诉 NumPy 重塑数组arr,使其在最后一个轴上具有大小为 10 的形状。-1告诉 NumPy 为第一个轴提供填充数组所需的任何大小。

请注意,reshape以这种方式使用要求它len(intensities)可以被您要分组的大小(例如 10、50、100)整除。

于 2013-04-11T22:25:40.890 回答