【问题标题】:Get the mapping from each element of input to the bin of the histogram in Julia获取从输入的每个元素到 Julia 中直方图 bin 的映射
【发布时间】:2019-02-26 06:12:58
【问题描述】:

Matlab 的 [n,mapx] = histc(x, bin_edged) 将每个 bin 中 x 的计数返回为 n 并返回一个映射,该映射与 x 的长度相同,x 的每个元素被放入其中的 bin 索引。

我可以在 Julia 中做同样的事情,如下所示:

Using StatsBase
x = rand(1000)
bin_e = 0:0.1:1
h = fit(Histogram, x, bin_e)
yx = map((z) -> findnext(z.<=h.edges[1],1),x) .- 1

这是执行此操作的“正确方法”吗?看起来有点笨拙。

【问题讨论】:

    标签: julia histogram


    【解决方案1】:

    this python question 的启发,您应该能够定义一个小函数来提供所需的映射(模数约定):

    binindices(edges, data) = searchsortedlast.(Ref(edges), data)
    

    请注意,bin 边缘已排序,我们可以使用seachsortedlast 来使最后一个 bin 边缘小于或等于数据点。在我们获得映射的所有数据上广播这个。请注意,Ref(edges) 表示 edges 是广播下的标量(这意味着在每次调用中都会考虑整个数组)。

    虽然在概念上与您的解决方案相同,但这种方法在我的机器上快了大约 13 倍。

    我在StatsBase.jl's github page 提出了一个问题,建议将其添加为一项功能。

    【讨论】:

    • 我意识到我们的两个答案都不完整,因为实际的地图取决于直方图是左闭还是右闭(当数据元素正好 == bin 边缘时。
    【解决方案2】:

    查看 Histogram.jl 的代码后,我发现它们已经包含了一个函数 binindex。所以这个解决方案可能是最好的:

    x = 0:0.001:10
    h1 = fit(Histogram,x,0:10,closed=left)
    xmap1 = StatsBase.binindex.(Ref(h1), x)
    h2 = fit(Histogram,x,0:10,closed=right)
    xmap2 = StatsBase.binindex.(Ref(h2), x)
    

    【讨论】:

      【解决方案3】:

      当我试图弄清楚每个值在值列表中出现了多少次时,我偶然发现了这个问题。如果每个值都在自己的 bin 中(对于分类数据或具有少量唯一值的整数数据),这就是在直方图中绘制的内容。

      如果这是您想要的,那么 StatBase 包中的 countmap() 正是您所需要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 2020-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        相关资源
        最近更新 更多