我正在尝试计算每个垃圾箱内的平均值。 一切正常,但我得到了' 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
答案 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])