Julia 根据是否存在可选关键字参数设置函数输出类型
我需要做一个柱状图,我的每个数据点都有一个统计权重。没有配备标准的Julia 根据是否存在可选关键字参数设置函数输出类型,julia,Julia,我需要做一个柱状图,我的每个数据点都有一个统计权重。没有配备标准的hist功能来处理此问题。当然,我可以导入,它可以很好地处理加权数据,但我认为这是学习julia的一个很好的练习,可以尝试扩展hist()函数以接受权重作为可选(命名)参数 我从查看的julia源代码开始,并能够稍微修改它(如果是业余的话——欢迎改进建议),以使其正常工作: function sturges(n) # Sturges' formula n==0 && return one(n) i
hist
功能来处理此问题。当然,我可以导入,它可以很好地处理加权数据,但我认为这是学习julia的一个很好的练习,可以尝试扩展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)
然后weightedhist(v,边;weights=w)
与numpy.直方图(v,边,weights=w)
一致。如果我省略了权重的可选关键字参数,那么weightedhist(v,edges)
与内置的hist(v,edges)
一致,而weightedhist(v)
与内置的hist(v)
一致,除了当没有提供权重时,我的函数输出为浮点而不是整数
我不明白为什么会出现这种情况(h是否被创建为浮点数组?升级了?),我希望my函数在没有提供权重的情况下尽可能依赖内置数组的行为
有人能告诉我为什么我的函数要输出浮点,以及在没有提供权重的情况下,我如何将该行为更改为输出整数吗?我不希望先创建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)
就足够了。我最初尝试过,但当没有权重时,它会输出int,但当给出可选权重参数时,它会给我一个不精确错误()
指向行h[I]+=weights[j]
。哦,我明白了,这是有意义的(它试图在整数数组中填充浮点数,这是不安全的,因此是不精确的)。我已经更新了我的答案,使用eltype
,应该可以处理它。eltype
正是我需要的!工作得很好。谢谢!
weightedhist!(Array(Float64, length(edg)-1), v, edg; weights=weights)