簡體   English   中英

在 Numpy 數組中提取高於特定閾值的連續值

[英]Extracting continuous values above a certain threshold in a Numpy array

對於學校項目,我需要實現以下功能:

創建一個函數find_intervals(s, threshold)在輸入中接收一個 Series s 和一個閾值。

找到信號高於給定閾值時的連續周期。

該函數應返回一個系列,該系列將每個連續期間的開始日期作為索引,並將以天數表示的期間長度作為關聯值。 結果應按周期長度降序排列。

當應用於這樣的信號時(thershold=0 的橙色線):

在此處輸入圖片說明

它應該返回以下系列:

70     35
140    35
1      34
Name: interval, dtype: int64

也就是說,最大的間隔是 35 個單位,從標簽 70 開始,然后還有另一個長度為 35 的間隔,從 140 開始,依此類推。在練習中,索引將是一個日期,間隔的長度表示為天。

我已經編寫了以下函數(在此 Stackoverflow 答案的幫助下。)

def intervals(samples,threshold):
    samples = np.array(samples)
    start = -1
    intervals = []
    for idx,x in enumerate(samples):
        if start < 0 and abs(x) < threshold:
            start = idx
        elif start >= 0 and abs(x) >= threshold:
            dur = idx-start
            if dur >= 0:
                intervals.append((start))
            start = -1
    return intervals

但是,當我在類似的 Sin 波上調用此函數時,該函數不適用於閾值 0 或任何負值。 我真的想不通為什么。

編輯:這是我嘗試過的和得到的結果;

在下面的作品中,我繪制了一個簡單的 Sin 波。

x = np.arange(0,64*np.pi,1) 
y = np.sin(x/11)
df = pd.Series(data=y,index=x)
plt.plot(x,y)
df = np.array(df)

在此處輸入圖片說明

當我以intervals(df,0.5)運行代碼時intervals(df,0.5)我得到[0, 34, 69, 103, 138, 172]這是預期的。

然而;

如果我做; intervals(df,0)我得到一個空列表,對於任何負閾值都可以說同樣的事情。

將您的功能更改為:

def find_intervals2(samples, threshold):
    samp = samples[samples >= threshold]
    xx = samp.groupby((samp.index != samp.index.to_series().shift() + 1)
        .cumsum()).apply(lambda grp: (grp.index[0], grp.size))
    return pd.Series(xx.str[1].values, index=xx.str[0]).sort_values(ascending=False)

請注意,結果是Series而不是list

為了展示一個更有啟發性的例子,將源系列定義為:

x = np.arange(0, 68 * np.pi, dtype=int)
y2 = np.sin(x / 11 * (1000 - x) // 7 / 142)
s2 = pd.Series(data=y2, index=x)
plt.plot(s2)
plt.grid(True);

注意圖的“逐步遞減”頻率。

然后當你運行find_intervals(s2, -0.2)結果是:

162    52
72     48
0      39
dtype: int64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM