在移动平均线中处理零点

时间:2013-09-12 07:21:54

标签: python numpy average zero

修改

我原来的帖子不是最好的文章,所以我重写了它。

所以我要做的是计算数据数组的移动平均值。每个平均值被接管,例如,24个值。 但是,我有两个条件需要在当前函数中更改。

  • 平均超过24个不为零的值,因为零被视为坏数据,因此我希望平均值为24'良好'。
  • 如果有五个连续零,我不想取平均值,只是说平均值为零。

我需要 这是我目前的功能,但需要更新以包含这些更改。

def averaged_rel_track(navg, rel_values, nb):
    '''function to average the relative track values for each blade. This is 
    dependant on the number values specified by the user to average over in a 
    rolling average'''
    avg_rel_track=[]
    for blade in range(0,int(nb)):
        av_values=[]
        rel_blade=rel_values[:,int(blade)]
        for rev in range(0,len(rel_blade)):
            section=rel_blade[rev-int(navg)+1:rev+1]
            print section
            if np.any(section==0):   
                av_value=0
            else:
                av_value=np.sum(section)/int(navg)
            print av_value
            av_values.append(av_value)
        avg_rel_track.append(av_values)
    avg_rel_track=np.array(avg_rel_track) 
    return avg_rel_track.transpose()

目前有很多检查。

是否有一个函数可以选择X个非零/无值的值?目前我正在尝试做的事情是这样的:

Select a section of data than is N values long
x= number of zeros/nan's in the data
Extend section by x values

但这不起作用,因为我需要检查新的部分不包含零,它会检测到原始的零。我可以检查零的扩展名,重复这个过程,但这似乎是一个非常漫长的方式来做到这一点。

我知道scipy.stats.nanmean在平均数据时会忽略无值。

如果有人能提供帮助那就太棒了,但我想提出的主要问题是:

  

是否有一个函数可以选择N值不为零或一个?

3 个答案:

答案 0 :(得分:1)

1)你能更准确地了解你的工作吗?你的集合是什么,你有什么对象,容器的类型是什么(数组,集合......)

2)您可以处理第二个"设置",您使用非零值更新

3)如果2)太麻烦,你总是可以随机选择N * 1.1对象,并尝试在其中找到N个非零对象并重复,如你所知。这对我来说似乎是一个很好的功能算法,没有错,不用担心

答案 1 :(得分:1)

对于numpy数组:

>>> a = np.array([2, 1, 0, np.nan, 0, 5, 6, np.nan, 1, 9, 0, 1, 8, 7, 4])
>>> a[~np.isnan(a) & (a != 0)]
array([ 2.,  1.,  5.,  6.,  1.,  9.,  1.,  8.,  7.,  4.])
>>> a[~np.isnan(a) & (a != 0)][:5]
array([ 2.,  1.,  5.,  6.,  1.])

对于Python列表:

>>> import math
>>> a = [2, 1, 0, float('nan'), 0, 5, 6, float('nan'), 1, 9, 0, 1, 8, 7, 4]
>>> [x for x in a if x and not math.isnan(x)]
[2, 1, 5, 6, 1, 9, 1, 8, 7, 4]
>>> [x for x in a if x and not math.isnan(x)][:5]
[2, 1, 5, 6, 1]

注意:明确使用if x and not math.isnan(x)代替if x,因为nan在用作谓词时被视为True

>>> bool(np.nan)
True
>>> bool(float('nan'))
True
>>> bool(None)
False

>>> float('nan') == float('nan')
False
>>> np.nan == np.nan
False
>>> math.isnan(float('nan')), math.isnan(np.nan)
(True, True)
>>> np.isnan(float('nan')), np.isnan(np.nan)
(True, True)

答案 2 :(得分:0)

from itertools import islice, ifilter
list(islice(ifilter(None, data), 0, N))