Numpy:在每个时间步长平均许多数据点

Dan*_*ein 3 python numpy matplotlib scipy

这个问题可能在某个地方得到解答,但我找不到哪里,所以我会在这里问:

我有一组数据,每个时间步长有几个样本.所以,我基本上有两个数组,"时间",看起来像:(0,0,0,1,1,1,1,1,2,2,3,4,4,4,4,... .)和我的数据,这是每次的价值.每个时间步长具有随机数量的样本.我希望以有效的方式获得每个时间步长的数据的平均值.

我准备了以下示例代码来显示我的数据.基本上,我想知道是否有更有效的方法来编写"average_values"函数.

import numpy as np
import matplotlib.pyplot as plt

def average_values(x,y):
    unique_x = np.unique(x)
    averaged_y = [np.mean(y[x==ux]) for ux in unique_x]
    return unique_x, averaged_y

#generate our data
times   = []
samples = []

#we have some timesteps:
for time in np.linspace(0,10,101):

    #and a random number of samples at each timestep:
    num_samples = np.random.random_integers(1,10)

    for i in range(0,num_samples):
        times.append(time)
        samples.append(np.sin(time)+np.random.random()*0.5)

times   = np.array(times)
samples = np.array(samples)

plt.plot(times,samples,'bo',ms=3,mec=None,alpha=0.5)
plt.plot(*average_values(times,samples),color='r')
plt.show()
Run Code Online (Sandbox Code Playgroud)

这是它的样子: 在此输入图像描述

Jai*_*ime 9

执行此操作的通用代码将执行以下操作:

def average_values_bis(x, y):
    unq_x, idx = np.unique(x, return_inverse=True)
    count_x = np.bincount(idx)
    sum_y = np.bincount(idx, weights=y)

    return unq_x, sum_y / count_x
Run Code Online (Sandbox Code Playgroud)

添加上面和后面的函数来绘制脚本

plt.plot(*average_values_bis(times, samples),color='g')
Run Code Online (Sandbox Code Playgroud)

产生此输出,红线隐藏在绿色背后:

在此输入图像描述

但两种方法的时间安排都显示出使用bincount效率提高了30倍:

%timeit average_values(times, samples)
100 loops, best of 3: 2.83 ms per loop

%timeit average_values_bis(times, samples)
10000 loops, best of 3: 85.9 us per loop
Run Code Online (Sandbox Code Playgroud)


ely*_*ase 5

我可以提出一个熊猫解决方案.如果您打算使用时间序列,强烈建议您使用.

创建测试数据

import pandas as pd
import numpy as np

times = np.random.randint(0,10,size=50)
values = np.sin(times) + np.random.random_sample((len(times),))
s = pd.Series(values, index=times)
s.plot(linestyle='.', marker='o')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

计算平均值

avs = s.groupby(level=0).mean()
avs.plot()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述