Numpy:如何使用无限范围的区间

9

在我的Python脚本中,我有一些想要分组的浮点数。目前我正在做以下操作:

min_val = 0.0
max_val = 1.0
num_bins = 20
my_bins = numpy.linspace(min_val, max_val, num_bins)
hist,my_bins = numpy.histogram(myValues, bins=my_bins)

现在我想添加两个箱子,以解决小于 0.0 和大于 1.0 的值。因此,一个箱子应该包括所有(-inf,0)中的值,另一个箱子应该包括所有 [1,inf) 中的值。

是否有任何简单直接的方法可以在仍然使用 numpy 的 histogram 函数的情况下实现此操作?

3个回答

12

函数numpy.histogram()可以在bins参数中愉快地接受无限值:

numpy.histogram(my_values, bins=numpy.r_[-numpy.inf, my_bins, numpy.inf])

或者,您可以结合使用numpy.searchsorted()numpy.bincount(),但是我认为那种方法并没有太多优势。


使用matplotlib(plt),尽管它在内部使用numpy的hist函数,但它不接受inf(绘制无限的柱状图可能太多了吧?:-))。但对于我的情况来说,一个非常大的值(相对于我的数据的典型范围)效果很好。 - Josiah Yoder

3
您可以将numpy.inf指定为上限,将-numpy.inf指定为下限的分箱限制。

0

在Numpy 1.16版本中,您可以使用histogram_bin_edges。使用此功能,今天的解决方案调用histogram_bin_edges来获取bin,将-inf和+inf连接起来,并将其作为bin传递给histogram

a=[1,2,3,4,2,3,4,7,4,6,7,5,4,3,2,3]
np.histogram(a, bins=np.concatenate(([np.NINF], np.histogram_bin_edges(a), [np.PINF])))

结果为:

(array([0, 1, 3, 0, 4, 0, 4, 1, 0, 1, 0, 2]),
array([-inf,  1. ,  1.6,  2.2,  2.8,  3.4,  4. ,  4.6,  5.2,  5.8,  6.4, 7. ,  inf]))

如果你喜欢让最后一个 bin 为空(就像我一样),你可以使用 range 参数并在 max 上加上一个小数:

a=[1,2,3,4,2,3,4,7,4,6,7,5,4,3,2,3]
np.histogram(a, bins=np.concatenate(([np.NINF], np.histogram_bin_edges(a, range=(np.min(a), np.max(a)+.1)), [np.PINF])))

结果为:

(array([0, 1, 3, 0, 4, 4, 0, 1, 0, 1, 2, 0]),
array([-inf, 1.  , 1.61, 2.22, 2.83, 3.44, 4.05, 4.66, 5.27, 5.88, 6.49, 7.1 ,  inf]))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接