在没有Pylab的情况下创建Python直方图

时间:2014-02-07 04:27:11

标签: python matplotlib histogram gaussian

我必须生成一个高斯分布的随机数列表(我能够做到这一点),然后取出这些数字并在直方图中绘制它们。我的问题是我不应该在pylab(或其他任何包)中使用内置的直方图函数来完成这项工作,而且我完全失败了。我一直在网上查找,但我找不到任何可以解释我会怎么做的事情,你们有谁知道我能做些什么吗?提前谢谢。

3 个答案:

答案 0 :(得分:5)

计算直方图的一种快速方法是一次遍历列表中的一个元素,找出它应该在哪个bin中,然后计算每个bin中的条目数。

hist_vals = np.zeros(nbins)
for d in data:
    bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
    hist_vals[bin_number] += 1

请注意,这有一个O(len(data))具有较小的前因子。

更聪明的方法是对散列函数进行矢量化:

bin_number = (nbins * ((data - min_val) / (max_val - min_val))).astype(np.int)

并使用切片魔法进行求和:

hist_vals[bin_number] += 1  # numpy slicing magic

如果您担心速度,可以使用基本上执行此操作的numpy函数,但将循环放在c级别:

bin_nums = np.digitize(data, bins) - 1
hist_vals = np.bincount(bin_nums)

答案 1 :(得分:1)

假设您有一个代表随机数的numpy数组

        rnd_numb=array([ 0.48942231,  0.48536864,  0.48614467, ...,  0.47264172,
    0.48309697,  0.48439782])

为了创建直方图,您只需要对数据进行分类。所以让我们创建一个定义分箱

的数组
       bin_array=linspace(0,1,100)

在这种情况下,我们将创建100个线性间隔的区间,范围为0到1

现在,为了创建直方图,您只需执行

即可
  my_histogram=[]
  for i in range(len(bin_array)-1):
     mask = (rnd_numb>=bin_array[i])&(rnd_numb<bin_array[i+1])
     my_histogram.append(len(rnd_numb[mask]))

这会创建一个包含每个bin中计数的列表。最后,如果您想要直方图可视化,您可以

 plot ((bin_array[1:]+bin_array[:-1])/2.,my_histrogram)

您还可以尝试stepbar

答案 2 :(得分:1)

这是一个基于@tacaswell解决方案的版本,但不使用numpy。

def histogram(data, nbins, min_val=None, max_val=None):
    hist_vals = [0]*(nbins+1)
    if min_val is None:
        min_val = min(data)
    if max_val is None:
        max_val = max(data)

    for d in data:
        bin_number = int(nbins * ((d - min_val) / (max_val - min_val)))
        hist_vals[bin_number] += 1
    bin_lower_bounds = [min_val + i*(max_val - min_val)/len(hist_vals) for i in range(len(hist_vals))]
    return hist_vals, bin_lower_bounds