首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算平均值和标准差并忽略0值

计算平均值和标准差并忽略0值
EN

Stack Overflow用户
提问于 2020-05-16 07:32:00
回答 4查看 315关注 0票数 1

我有一个列表和子列表,所有的列表都包含浮点值。例如,下面的列表有2个列表,每个列表都有子列表:

代码语言:javascript
复制
 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]]]

我想计算子列表的标准差和平均值,我应用的是:

代码语言:javascript
复制
mean = [statistics.mean(d) for d in mylist]
stdev = [statistics.stdev(d) for d in mylist]

但它也接受我不想要的0.0值,因为为了不让它们为空,我把它们变成了0。有没有一种方法可以忽略这些0,因为它们不存在于子列表中?根本不考虑它们?我找不到一种方法来做这件事。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-16 07:45:31

您可以使用numpy的nanmeannanstd函数。

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2020-05-16 07:58:45

您可以使用list comprehension来完成此操作。

下面的lambda函数将nested列表展平为单个列表,并过滤掉全零:

代码语言:javascript
复制
flatten = lambda nested: [x for sublist in nested for x in sublist if x != 0]

注意,列表理解有两个for和一个if语句,类似于下面的代码片段,它的作用基本上是一样的:

代码语言:javascript
复制
flat_list = []

for sublist in nested:
   for x in sublist:
       if x != 0:
           flat_list.append(x)

要将其应用于您的列表,您可以使用mapmap函数将返回一个迭代器。要获得一个列表,我们需要将迭代器传递给list

代码语言:javascript
复制
flat_list = list(map(flatten, myList))

现在您可以计算平均值和标准差:

代码语言:javascript
复制
mean = [statistics.mean(d) for d in flat]
stdev = [statistics.stdev(d) for d in flat]

print(mean)
print(stdev)
票数 2
EN

Stack Overflow用户

发布于 2020-05-16 08:15:06

代码语言:javascript
复制
mean = [statistics.mean(d) for d in mylist if d != 0]
stdev = [statistics.stdev(d) for d in mylist if d != 0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61829946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档