箱内的平均值计算

时间:2018-02-11 09:19:52

标签: python numpy mean bins

我正在尝试计算每个垃圾箱内的平均值。 一切正常,但我得到了' nan'第一个bin中的平均值。我想这不对。你能帮我找个错误吗?

这是我的代码:

data = np.array([-90,-1,2,3,5,6,8,10,121])

bin_s = np.array([-np.inf, 1, 3, 5, 8, 9, +np.inf])

dig = np.digitize(data, bin_s)
sol = np.bincount(dig, data) / np.bincount(dig)
sol

Code and result

2 个答案:

答案 0 :(得分:1)

Numpy的bincount返回个别垃圾箱的数量。但是,如果某些bin为空,则相应的值将为零,因此除np.bincount(dig)将失败。快速修复将是

 sol = np.bincount(dig, data) / np.array([max(1, v) for v in np.bincount(dig)])

即,对于这样的箱子除以1而不是0,因为在这种情况下我们知道箱子是空的,因此np.bincount(dig, data)中的对应值也是零(但是,这取决于你想要的方式)解释空箱的意思。这将给出:

[  0.  -45.5   2.    3.    5.5   8.   65.5]

这里的第一个元素不是假的,但它对应于零bin索引,它会聚合小于min(bin_s)的数据。但是,由于此数字是您的-np.inf,因此没有此类数据。但有可能发生甚至一些中间箱变空。例如,如果您将输入数据作为输入:

data = np.array([-90,-1,2,3,10,121])

然后np.bincount返回[0 2 1 1 0 0 2],所以还需要处理其他零,不仅忽略第一个元素......

此外,您可以考虑由scipy提供的binned_statistic直接执行此操作:

import numpy as np
from scipy.stats import binned_statistic as bstat

data = np.array([-90,-1,2,3,5,6,8,10,121])

stat = bstat(data, data, statistic = 'mean', bins = [-np.inf, 1, 3, 5, 8, 9, +np.inf])
print(stat[0])

答案 1 :(得分:0)

第一个bin是假的,无视它:

np.bincount(dig, data)[1:] / np.bincount(dig)[1:]
#array([-45.5,   2. ,   3. ,   5.5,   8. ,  65.5])