修改
我原来的帖子不是最好的文章,所以我重写了它。
所以我要做的是计算数据数组的移动平均值。每个平均值被接管,例如,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值不为零或一个?
答案 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))