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