我需要制作一个直方图,并且我的每个数据点都带有统计权重。标准 hist
函数无法处理此问题。我当然可以导入 numpy.histogram function ,它可以很好地处理加权数据,但我认为这将是学习 Julia 的一个很好的练习,尝试增强 hist()
函数以接受权重作为可选(命名)参数。
我首先查看 hist() 的 Julia 源代码,并且能够稍微修改它(如果是业余的——欢迎提出改进建议),以使其正常工作:
function sturges(n) # Sturges' formula
n==0 && return one(n)
iceil(log2(n))+1
end
function weightedhist!{HT}(h::AbstractArray{HT}, v::AbstractVector, edg::AbstractVector; init::Bool=true, weights::AbstractVector = ones(HT,length(v)))
n = length(edg) - 1
length(weights) == length(v) || error("length(weights) must equal length(v)")
length(h) == n || error("length(h) must equal length(edg) - 1.")
if init
fill!(h, zero(HT))
end
for j=1:length(v)
i = searchsortedfirst(edg, v[j])-1
if 1 <= i <= n
h[i] += weights[j]
end
end
edg, h
end
weightedhist(v::AbstractVector, edg::AbstractVector; weights::AbstractVector = ones(Int,length(v))) = weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)
weightedhist(v::AbstractVector, n::Integer; weights::AbstractVector = ones(Int,length(v))) = weightedhist(v, histrange(v,n); weights=weights)
weightedhist(v::AbstractVector; weights::AbstractVector = ones(Int,length(v))) = weightedhist(v, sturges(length(v)); weights=weights)
如果我生成一些随机数据
v = randn(10^5);
w = rand(length(v));
edges = floor(minimum(v)):0.1:ceil(maximum(v));
那么weightedhist(v,edges;weights=w)
与numpy.histogram(v,edges,weights=w)
一致。如果我省略了权重的可选关键字参数,则 weightedhist(v, Edges)
与内置的 hist(v, Edges)
一致,并且 weightedhist( v)
与内置的 hist(v)
一致,除了,因为当没有提供权重时,我的函数输出 float 而不是整数。
我不明白为什么会出现这种情况(h 是否被创建为 float 组?被提升?),并且我希望 my 函数能够尽可能地依赖于内置函数的行为当没有提供权重时可能。
任何人都可以建议为什么我的函数输出 float ,以及在没有提供权重时如何更改该行为以输出整数?我想在不首先创建 h 数组然后将其从一种类型转换为另一种类型的情况下执行此操作,因为我希望代码尽可能快。
最佳答案
如果我理解正确的话,当你打电话时
weightedhist(v, edges)
您正在使用底部三个“额外”定义中的第一个。
这调用
weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)
所以在你的“main”weightedhist!
中,HT
参数化将是Float64
,所以h
将是填充
为HT
== Float64
,因此输出为Float64
。因此,我相信将其更改为 Array(eltype(weights), length(edg)-1) 就足够了。
关于julia - 根据是否存在可选关键字参数设置函数输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045969/