计算均值和标准差,忽略0值

问题描述 投票:1回答:3

我有一个带有子列表的列表列表,所有子列表都包含浮点值。例如,下面的一个有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,因为它们在子列表中不存在?根本不考虑它们吗?我找不到方法。

python list mean standard-deviation sublist
3个回答
1
投票

您可以使用numpy的nanmeannanstd函数。

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]

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]

0
投票

您可以通过列表理解来做到这一点。

以下lambda函数将nested列表展平为单个列表并滤除所有零:

flatten = lambda nested: [x for sublist in nested for x in sublist if x != 0]

要将其应用于您的列表,您可以使用mapmap函数将返回一个迭代器。要获取列表,我们需要将迭代器传递给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)
© www.soinside.com 2019 - 2024. All rights reserved.