[英]Excluding rightmost edge in numpy.histogram
我有一个数字列表a
和一个 bin 列表,我将使用numpy.histogram
对a
中的数字进行分类。 这些 bin 是根据 a 的平均值和标准差( std
) 计算得出a
。 所以 bin 的数量是B
,第一个 bin 的最小值是mean - std
,最后一个 bin 的最大值是mean + std
。 (粗体字表示我的最终目标)
一个例子如下:
>>> a
array([1, 1, 3, 2, 2, 6])
>>> bins = np.linspace(mean - std, mean + std, B + 1)
array([ 0.79217487, 1.93072496, 3.06927504, 4.20782513]))
>>> numpy.histogram(a, bins = bins)[0]
(array([2, 3, 0], dtype=int32)
但是,我想排除最后一个 bin 的最右边 - 即,如果 a 中a
值完全等于mean + std
,我不希望将它包含在最后一个 bin 中。 关于mean
和std
差的漫画并不重要,不包括最右边的边缘(也就是使其成为半开区间)。 不幸的是, 医生在这方面说:
除了最后一个(最右边的)垃圾箱外,所有垃圾箱都是半开的。 换句话说,如果 bins 是:
[1, 2, 3, 4] 那么第一个 bin 是 [1, 2)(包括 1,但不包括 2),第二个 bin 是 [2, 3)。 然而,最后一个 bin 是 [3, 4],其中包括 4。
有没有我可以采用的简单解决方案? 也就是说,一种不涉及手动固定边缘的方法。 这是我可以做的,但这不是我想要的。 是否有我可以通过的标志或可以使用的不同方法?
这是一种(一种粗略的?)方法可以将最后一个垃圾箱变成半开而不是关闭。 我正在做的是从最右边的 bin 的右侧减去可能的最小值:
a = np.array([1, 1, 3, 2, 2, 6])
B = 3 # (in this example)
bins = np.linspace(a.mean() - a.std(), a.mean() + a.std(), B + 1)
# array([ 0.79217487, 1.93072496, 3.06927504, 4.20782513]))
bins[-1] -= np.finfo(float).eps # <== this is the crucial line
np.histogram(a, bins = bins)
如果您对a
中的值使用 float 以外的其他类型,请在对finfo
的调用中使用不同的类型。 例如:
np.finfo(float).eps
np.finfo(np.float128).eps
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.