Python:如何制作具有相同*大小* bin 的直方图

标签 python histogram spacing binning

我有一组数据,想绘制它的直方图。我需要容器具有相同的大小,我的意思是它们必须包含相同数量的对象,而不是更常见的 (numpy.histogram) 问题等距 垃圾箱。 这自然会以箱宽度为代价,箱宽度可以 - 通常会 - 不同。

我将指定所需 bin 的数量和数据集,作为返回获得 bin 边缘。

Example:
data = numpy.array([1., 1.2, 1.3, 2.0, 2.1, 2.12])
bins_edges = somefunc(data, nbins=3)
print(bins_edges)
>> [1.,1.3,2.1,2.12]

所以 bin 都包含 2 个点,但它们的宽度(0.3、0.8、0.02)不同。

有两个限制: - 如果一组数据相同,则包含它们的 bin 可能更大。 - 如果有 N 个数据并请求 M 个 bin,如果 N%M 不为 0,则将有 N/M 个 bin 加一个。

这段代码是我编写的一些代码,对于小型数据集效果很好。如果我有 10**9+ 分并想加快流程怎么办?

  1 import numpy as np
  2 
  3 def def_equbin(in_distr, binsize=None, bin_num=None):
  4 
  5     try:
  6 
  7         distr_size = len(in_distr)
  8 
  9         bin_size = distr_size / bin_num
 10         odd_bin_size = distr_size % bin_num
 11 
 12         args = in_distr.argsort()
 13 
 14         hist = np.zeros((bin_num, bin_size))
 15 
 16         for i in range(bin_num):
 17             hist[i, :] = in_distr[args[i * bin_size: (i + 1) * bin_size]]
 18 
 19         if odd_bin_size == 0:
 20             odd_bin = None
 21             bins_limits = np.arange(bin_num) * bin_size
 22             bins_limits = args[bins_limits]
 23             bins_limits = np.concatenate((in_distr[bins_limits],
 24                                           [in_distr[args[-1]]]))
 25         else:
 26             odd_bin = in_distr[args[bin_num * bin_size:]]
 27             bins_limits = np.arange(bin_num + 1) * bin_size
 28             bins_limits = args[bins_limits]
 29             bins_limits = in_distr[bins_limits]
 30             bins_limits = np.concatenate((bins_limits, [in_distr[args[-1]]]))
 31 
 32         return (hist, odd_bin, bins_limits)

最佳答案

使用您的示例案例(2 个点的 bin,总共 6 个数据点):

from scipy import stats
bin_edges = stats.mstats.mquantiles(data, [0, 2./6, 4./6, 1])
>> array([1. , 1.24666667, 2.05333333, 2.12])

关于Python:如何制作具有相同*大小* bin 的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863059/

相关文章:

python - 将 matplotlib 保存为最终给定大小(包括标题)

c# - process.Start() 在 C# 中无法调用 python 脚本

java - 打印文件中字母的水平直方图。如何扩展它? java

jquery - 菜单切换如果单击则添加间距(边距)

Android GridView 列拉伸(stretch)

java - 初学者java - 向后打印直角三角形

python - 如何更改 .describe() 输出的格式?

python - matplotlib 光标信息似乎依赖于刻度分辨率 - 如何更改此依赖关系

python - 月份的正确顺序 Python

python - matplotlib:如何在二维直方图中指定颜色级别