julia - 根据是否存在可选关键字参数设置函数输出类型

标签 julia

我需要制作一个直方图,并且我的每个数据点都带有统计权重。标准 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/

相关文章:

optimization - 具有单变量优化的 NLopt

matrix - 提取矩阵的下三角部分

arrays - Julia 类型内的数组

julia - 形成内积的最佳方法是什么?

amazon-s3 - Julia 从 s3 csv 文件加载数据框

Julia 中的结构文字

julia - 为什么在 Julia 中重命名了这些对集合的常见操作?

performance - Julia 性能改进建议

dictionary - 如何生成随机概率分布 julia

julia - Julia 的 GLM 可以进行加权最小二乘吗?