如何使用 Python 中的枚举来计算列表的 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
的最终数组。这在我的代码中发生了。然而,当我测试它时,我的代码没有产生正确的标准偏差值——也就是说输出到 w1sd
、w2sd
等的值是不正确的(但是数组的大小是正确的) : 3980
元素的数组)。我假设我在计算标准偏差时混淆了错误的指数。
以下是数据集中的示例值。所有数据应属于 w1
和 w1sd
,因为此示例中提供的 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
数组中的数据集,并将所有循环和索引从你手中解放出来。
在这种情况下,我将定义一个 dataframe
具有 N_raytimes
行和 N_Height
列,这将允许以您喜欢的任何方式轻松地切片和聚合数据。
这段代码给出了预期的输出。
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
我正在尝试计算列表的标准偏差 vr
。列表大小为 32,包含大小为 3980 的数组。此数组表示给定 height
(3980 高度)的值。
首先,我将数据分成 15 分钟的块,其中分钟在 raytimes
中给出。 raytimes
也是一个大小为 32
的列表(仅包含观察时间 vr
)。
我想要在每个 height
级别计算标准偏差,这样我最终得到一个大小为 3980
的最终数组。这在我的代码中发生了。然而,当我测试它时,我的代码没有产生正确的标准偏差值——也就是说输出到 w1sd
、w2sd
等的值是不正确的(但是数组的大小是正确的) : 3980
元素的数组)。我假设我在计算标准偏差时混淆了错误的指数。
以下是数据集中的示例值。所有数据应属于 w1
和 w1sd
,因为此示例中提供的 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
数组中的数据集,并将所有循环和索引从你手中解放出来。
在这种情况下,我将定义一个 dataframe
具有 N_raytimes
行和 N_Height
列,这将允许以您喜欢的任何方式轻松地切片和聚合数据。
这段代码给出了预期的输出。
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