簡體   English   中英

如何在 Python 中使用 enumerate 來計算列表的 STD?

[英]How do I use enumerate in Python to compute STD of a list?

我正在嘗試計算列表vr的標准偏差。 列表大小為 32,包含大小為 3980 的數組。此數組表示給定height (3980 高度)處的值。

首先,我將數據分成 15 分鍾的塊,其中的分鍾以raytimes給出。 raytimes也是一個大小為32的列表(僅包含觀察時間, vr )。

我想要在每個height級別計算標准偏差,這樣我最終會得到一個大小為3980最終數組。 這發生在我的代碼中。 然而,我的代碼在測試時沒有產生正確的標准偏差值——也就是說,輸出到w1sdw2sd等的值不正確(但是數組的大小正確:一個包含3980元素的數組)。 我假設在計算標准偏差時我混淆了錯誤的索引。

以下是數據集中的示例值。 所有數據都應該屬於w1w1sd因為本示例中提供的raytimes都在 15 分鍾內 (< 0.25)。 我想計算vr的第一個元素的標准偏差,即2.0 + 3.1 + 2.1的標准偏差,然后是第二個元素,或標准偏差3.1 + 4.1 + nan等。 w1sd的結果應該是[0.497, 0.499, 1.0, 7.5]但是下面的代碼在w1sd = [0.497, 0.77, 1.31, 5.301]中給出了一個nanstd nanstd或我的索引有問題嗎?

vr = [
    [2.0, 3.1, 4.1, nan],
    [3.1, 4.1, nan, 5.1],
    [2.1, nan, 6.1, 20.1]
]
Height = [10.0, 20.0, 30.0, 40]
raytimes = [0, 0.1, 0.2]

for j, h in enumerate(Height): 
    for i, t in enumerate(raytimes):
        if raytimes[i] < 0.25:
            w1.append(float(vr[i][j]))
        elif 0.25 <= raytimes[i] < 0.5:
            w2.append(float(vr[i][j]))
        elif 0.5 <= raytimes[i] < 0.75:
            w3.append(float(vr[i][j]))
        else:
            w4.append(float(vr[i][j]))
    w1sd.append(round(nanstd(w1), 3))
    w2sd.append(round(nanstd(w2), 3))
    w3sd.append(round(nanstd(w3), 3))
    w4sd.append(round(nanstd(w4), 3))
    w1 = []
    w2 = []
    w3 = []
    w4 = []

我會考慮為此使用pandas 它是一個庫,允許高效處理numpy數組中的數據集,並讓您numpy進行所有循環和索引。

在這種情況下,我將定義一個包含N_raytimes行和N_Height列的dataframe N_raytimes ,這將允許以您喜歡的任何方式輕松切片和聚合數據。

此代碼給出了預期的輸出。

import pandas as pd
import numpy as np

vr = [
    [2.0, 3.1, 4.1, np.nan],
    [3.1, 4.1, np.nan, 5.1],
    [2.1, np.nan, 6.1, 20.1]
]
Height = [10.0, 20.0, 30.0, 40]
raytimes = [0, 0.1, 0.2]

# Define a dataframe with the data
df = pd.DataFrame(vr, columns=Height, index=raytimes)
df.columns.name = "Height"
df.index.name = "raytimes"

# Split it out (this could be more elegant)
w1 = df[df.index < 0.25]
w2 = df[(df.index >= 0.25) & (df.index < 0.5)]
w3 = df[(df.index >= 0.5) & (df.index < 0.75)]
w4 = df[df.index >= 0.75]

# Compute standard deviations
w1sd = w1.std(axis=0, ddof=0).values
w2sd = w2.std(axis=0, ddof=0).values
w3sd = w3.std(axis=0, ddof=0).values
w4sd = w4.std(axis=0, ddof=0).values

暫無
暫無

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

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