计算平均值和标准偏差并忽略 0 值
Calculating mean and standard deviation and ignoring 0 values
我有一个包含子列表的列表列表,所有子列表都包含浮点值。
例如,下面的列表有 2 个列表,每个列表都有子列表:
mylist = [[[2.67, 2.67, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]], [[2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 0.0, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]]]
我想计算子列表的标准偏差和平均值,我应用的是:
mean = [statistics.mean(d) for d in mylist]
stdev = [statistics.stdev(d) for d in mylist]
但它也采用我不想要的 0.0 值,因为我将它们变为 0 以免为空值。有没有办法忽略这些 0,因为它们不存在于子列表中?根本不考虑它们?我找不到解决方法。
尝试:
mean = [statistics.mean([k for k in d if k]) for d in mylist]
stdev = [statistics.stdev([k for k in d if k]) for d in mylist]
您可以使用 numpy 的 nanmean
和 nanstd
函数。
import numpy as np
def zero_to_nan(d):
array = np.array(d)
array[array == 0] = np.NaN
return array
mean = [np.nanmean(zero_to_nan(d)) for d in mylist]
stdev = [np.nanstd(zero_to_nan(d)) for d in mylist]
您可以使用 list comprehension。
以下 lambda 函数将 nested
列表展平为单个列表并过滤掉所有零:
flatten = lambda nested: [x for sublist in nested for x in sublist if x != 0]
请注意,列表理解有两个 for
和一个 if
类似于此代码片段的语句,它们的作用基本相同:
flat_list = []
for sublist in nested:
for x in sublist:
if x != 0:
flat_list.append(x)
要将此应用于您的列表,您可以使用 map
。 map
函数将 return 一个迭代器。要获得列表,我们需要将迭代器传递给 list
:
flat_list = list(map(flatten, myList))
现在你可以计算均值和标准差了:
mean = [statistics.mean(d) for d in flat]
stdev = [statistics.stdev(d) for d in flat]
print(mean)
print(stdev)
mean = [statistics.mean(d) for d in mylist if d != 0]
stdev = [statistics.stdev(d) for d in mylist if d != 0]
我有一个包含子列表的列表列表,所有子列表都包含浮点值。 例如,下面的列表有 2 个列表,每个列表都有子列表:
mylist = [[[2.67, 2.67, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]], [[2.67, 2.67, 2.0, 2.0], [0.0, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [0.0, 0.0, 0.0, 0.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]]]
我想计算子列表的标准偏差和平均值,我应用的是:
mean = [statistics.mean(d) for d in mylist]
stdev = [statistics.stdev(d) for d in mylist]
但它也采用我不想要的 0.0 值,因为我将它们变为 0 以免为空值。有没有办法忽略这些 0,因为它们不存在于子列表中?根本不考虑它们?我找不到解决方法。
尝试:
mean = [statistics.mean([k for k in d if k]) for d in mylist]
stdev = [statistics.stdev([k for k in d if k]) for d in mylist]
您可以使用 numpy 的 nanmean
和 nanstd
函数。
import numpy as np
def zero_to_nan(d):
array = np.array(d)
array[array == 0] = np.NaN
return array
mean = [np.nanmean(zero_to_nan(d)) for d in mylist]
stdev = [np.nanstd(zero_to_nan(d)) for d in mylist]
您可以使用 list comprehension。
以下 lambda 函数将 nested
列表展平为单个列表并过滤掉所有零:
flatten = lambda nested: [x for sublist in nested for x in sublist if x != 0]
请注意,列表理解有两个 for
和一个 if
类似于此代码片段的语句,它们的作用基本相同:
flat_list = []
for sublist in nested:
for x in sublist:
if x != 0:
flat_list.append(x)
要将此应用于您的列表,您可以使用 map
。 map
函数将 return 一个迭代器。要获得列表,我们需要将迭代器传递给 list
:
flat_list = list(map(flatten, myList))
现在你可以计算均值和标准差了:
mean = [statistics.mean(d) for d in flat]
stdev = [statistics.stdev(d) for d in flat]
print(mean)
print(stdev)
mean = [statistics.mean(d) for d in mylist if d != 0]
stdev = [statistics.stdev(d) for d in mylist if d != 0]