【发布时间】:2012-10-03 12:06:49
【问题描述】:
我有一组数据,想要制作它的直方图。我需要容器具有相同的大小,我的意思是它们必须包含相同数量的对象,而不是更常见的(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)
【问题讨论】:
-
我可能没有正确理解这一点,但听起来你最终会得到一个非常无聊(例如完全平坦)的直方图。您只是想查找数据的一些分位数吗?
-
您好,您理解正确。因为每个值都是星系的大小,所以我将能够查看其他属性在每个单独的 bin 中的表现!
-
这听起来更像是分位数而不是直方图。
标签: python histogram spacing binning