1

编辑

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

所以我要做的是计算一组数据的移动平均值。例如,每个平均值都会被 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在平均数据时会忽略 none 值。

如果有人可以提供帮助,那就太好了,但我想建议的主要问题是:

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

4

3 回答 3

1

For numpy array:

>>> 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.])

For Python list:

>>> 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]

NOTE: Used if x and not math.isnan(x) explicitly instead of if x, because nan is treated as True when used as predicate:

>>> 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)
于 2013-09-12T07:48:52.740 回答
1

1)你能更精确一点你在做什么吗?你的集合是什么样的,你有什么对象,容器的类型是什么(数组,集合,...)

2)您可以处理第二个“集合”,您可以使用您拥有的非零值进行更新

3) 如果 2) 太麻烦,您总是可以随机选择 N * 1.1 个对象并尝试在其中找到 N 个非零对象并按照您的建议重复。这对我来说似乎也是一个很好的函数算法,没有错,别担心

于 2013-09-12T07:29:19.297 回答
0
from itertools import islice, ifilter
list(islice(ifilter(None, data), 0, N))
于 2013-09-12T07:46:51.810 回答