【问题标题】:Average data over time?一段时间内的平均数据?
【发布时间】:2017-04-07 07:54:41
【问题描述】:

我想以 5 秒的间隔计算样本数据中 SIGNAL 数据的平均 VAL1、VAL2 和 SIGNAL 值。换句话说,使用包含的样本数据,我想计算第一个数据点(在本例中为)01:45:18 到 01:45:22、01:45:23 到 01 之间的平均值: 45:27、01:45:28 到 01:45:32 和 01:45:33 到其余数据。

理想情况下,我希望将平均信息存储在变量中,例如:dec_average、ra_average 和 n_average

关于如何实现这一目标的任何建议或想法?这是我到目前为止的代码。

import sys
import os
import matplotlib.pyplot as plt
from matplotlib.dates import strpdate2num
import numpy as np
import matplotlib.colors
import matplotlib.cm

sat_id,dec,ra,n = np.loadtxt("mydata.asc", usecols=(3,5,7,9), unpack=True)

样本数据:
时间戳:01:45:18 SATID 02 VAL1 36 VAL2 188 SIGNAL 34
时间戳:01:45:19 SATID 02 VAL1 36 VAL2 188 SIGNAL 34
时间戳:01:45:20 SATID 02 VAL1 36 VAL2 188 SIGNAL 35
时间戳:01:45:21 SATID 02 VAL1 36 VAL2 188 SIGNAL 34
时间戳:01:45:22 SATID 02 VAL1 36 VAL2 188 SIGNAL 35
时间戳:01:45:23 SATID 02 VAL1 36 VAL2 188 SIGNAL 35
时间戳:01:45:24 SATID 02 VAL1 36 VAL2 188 SIGNAL 36
时间戳:01:45:25 SATID 02 VAL1 36 VAL2 188 SIGNAL 35
时间戳:01:45:26 SATID 02 VAL1 36 VAL2 188 SIGNAL 36
时间戳:01:45:27 SATID 02 VAL1 37 VAL2 188 SIGNAL 36
时间戳:01:45:28 SATID 02 VAL1 37 VAL2 188 SIGNAL 36
时间戳:01:45:29 SATID 02 VAL1 37 VAL2 188 SIGNAL 36
时间戳:01:45:30 SATID 02 VAL1 38 VAL2 188 SIGNAL 37
时间戳:01:45:31 SATID 02 VAL1 38 VAL2 188 SIGNAL 36
时间戳:01:45:32 SATID 02 VAL1 39 VAL2 188 SIGNAL 37
时间戳:01:45:33 SATID 02 VAL1 39 VAL2 188 SIGNAL 37
时间戳:01:45:34 SATID 02 VAL1 39 VAL2 188 SIGNAL 37
时间戳:01:45:35 SATID 02 VAL1 39 VAL2 188 SIGNAL 38

【问题讨论】:

标签: python numpy average


【解决方案1】:

第一步是从每个条目中获取重要数据,即VAL1VAL2SIGNAL 的值,您已完成。

然后对于每组五个条目,您需要获取每个字段的平均值,这可以通过将字段的每个值相加然后除以五来完成。使用numpy 这可以通过使用np.average() 并传入要平均的数组来实现,在我们的例子中,这将是第一次的前五个元素,第二次是接下来的五个,依此类推,对于dec,可以按如下方式完成。

我们将创建一个列表dec_average 来存储每组条目的平均值。

dec_average = []

这将遍历dec 数组,只要至少剩下五个元素,就对每组五个元素进行平均,并将该平均值附加到dec_average

for i in range(5, len(dec) + 1, 5):
    dec_average.append(np.average(dec[(i - 5):i]))

一旦我们完成了该循环的运行,如果数组中的元素数量不是 5 的倍数,那么仍然会有一些需要平均。为了得到它们的平均值,我们需要得到最后的x 项目,其中x 是数组长度除以五的余数;因此,模数。

if (len(dec)) % 5 != 0:
    dec_average.append(np.average(dec[-(len(dec) % 5):]))

将这三段代码放在一起形成一个系统,计算一个列表的每五个项目的平均值,如果最后剩下的项目少于五个,则只取剩余的平均值,并附加每个平均值到一个数组。这可以扩展以适合您的其他数据条目。

【讨论】:

  • 谢谢 Wintro... 这个令人难以置信的详细和彻底的解释真的让事情变得超级清晰。我真的很感激花时间来解释它这么好和彻底
  • 我的荣幸!我建议您查看 Daniel 的答案并投票/接受适合您的答案。
【解决方案2】:

来自 Alleo 的回答 here

def running_mean(x, N):
    cumsum = numpy.cumsum(numpy.insert(x, 0, 0)) 
    return (cumsum[N:] - cumsum[:-N]) / N

【讨论】:

  • 如果是重复的,请将其标记为重复,而不是复制(即使归因)答案。
猜你喜欢
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多