データセットがあり、そのヒストグラムを作成したいと思います。ビンは同じサイズである必要があります。つまり、等間隔のビンを持つというより一般的な(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)は異なります。
2つの制限があります。-データのグループが同一である場合、それらを含むビンは大きくなる可能性があります。-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)