1

編集

私の元の投稿は最良の説明ではなかったので、書き直しました。

だから私がやろうとしているのは、データの配列で移動平均を計算することです。各平均は、たとえば 24 個の値で取得されます。ただし、現在の関数で変更する必要がある 2 つの条件があります。

  • ゼロは悪いデータと見なされるため、ゼロではない 24 個の値の平均を取るので、平均には 24 個の「良い」値が必要です。
  • ゼロが 5 つ連続する場合、平均をとらず、単に平均がゼロであると言いたいのです。

これは現在の関数ですが、これらの変更を含めるために更新する必要があります。

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()

現時点では、多くのチェックが含まれています。

0/なし以外の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 値を無視することを知っています。

誰かがそれを助けることができれば素晴らしいことですが、私がアドバイスしたい主な質問は次のとおりです。

ゼロでも1でもないN個の値を選択する関数はありますか?

4

3 に答える 3

1

1)あなたが取り組んでいることをもう少し正確にできますか?あなたのセットはどのようなものですか、あなたが持っているオブジェクトは何ですか、コンテナのタイプは何ですか(配列、セット、...)

2)ゼロ以外の値で更新する2番目の「セット」を処理できます

3) 2) が面倒すぎる場合は、いつでも N * 1.1 オブジェクトのランダムな選択を選択し、その中の N 個の非ゼロ オブジェクトを見つけて、繰り返すことができます。これは私にとっても優れた機能的アルゴリズムのように思えます。問題はありません。心配しないでください。

于 2013-09-12T07:29:19.297 に答える
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 xnanTrue

>>> 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 に答える
0
from itertools import islice, ifilter
list(islice(ifilter(None, data), 0, N))
于 2013-09-12T07:46:51.810 に答える