参考julia-lang文档:
hist(v[, n])→e, counts
计算v的直方图,可选择使用大约n个bin。返回值是一个范围e,它对应于箱子的边,并且计数包含每个箱子中v的元素的数量。注意:Julia在计算中不会忽略NaN值。
我选择一个样本范围的数据
testdata=0:1:10;
然后使用hist函数计算1到5个箱子的直方图
hist(testdata,1) # => (-10.0:10.0:10.0,[1,10])
hist(testdata,2) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,3) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,4) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,5) # => (-2.0:2.0:10.0,[1,2,2,2,2,2])
如你所见,当我想要1个箱子时它计算2个箱子,当我想要2个箱子时它计算3个。
为什么会发生这种情况?
作为编写底层函数的人:目标是获得在基数为10的计数系统(即10k, 2×10k, 5×10k)中"不错"的bin宽度。如果你想要更多的控制,你也可以指定确切的bin边缘
文档中的关键字是approximate。您可以在Julia的base
模块中查看hist
实际为您做了什么。
当你执行hist(test,3)
时,你实际上是在调用
hist(v::AbstractVector, n::Integer) = hist(v,histrange(v,n))
也就是说,在第一步中,n
参数通过histrange
函数转换为FloatRange
,其代码可以在这里找到。正如您所看到的,这些步骤的计算并不完全简单,因此您应该稍微摆弄一下这个函数,以弄清楚它是如何构建构成直方图基础的范围的。