我有一组数据,并且想要对其进行直方图处理。我需要垃圾箱具有相同的大小,这意味着它们必须包含相同数量的对象,而不是更均匀的垃圾箱(numpy.histogram)问题。
这自然会以垃圾箱宽度为代价,而垃圾箱宽度可能会有所不同,并且总的来说会有所不同。

我将指定所需箱的数量和数据集,以获取箱边缘。

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]

因此,垃圾箱都包含2个点,但是它们的宽度(0.3、0.8、0.02)不同。

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

这段代码是我写的一些技巧,适用于小型数据集。如果我的积分超过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个点,总共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:如何使用大小相同的垃圾箱制作直方图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12863059/

10-12 02:29