【问题标题】:Define a custom sortperm function定义一个自定义的 sortperm 函数
【发布时间】:2019-06-27 23:22:30
【问题描述】:

在 Julia 中,假设我有以下矩阵:

julia> rank = [[1.0,2.0,NaN] [5.0,3.0,1.0]]
3×2 Array{Float64,2}:
   1.0  5.0
   2.0  3.0
 NaN    1.0

使用mapslicessortperm 获得每列的排名给出:

 r = mapslices(sortperm, rank; dims=1)
3×2 Array{Int64,2}:
 1  3
 2  2
 3  1

问题在于NaN 被视为“最差”元素,而不是保留在最终矩阵中。我最终想要的是:

3×2 Array{Int64,2}:
 1  3
 2  2
 NaN  1

我目前的解决方法是将r 的每个元素与rank 的元素进行比较。但我很确定 Julia 有一种更优雅的方式:p。

当前的解决方法:还不够,因为在 mapslices 之后需要额外的计算以及创建另一个数组 new_r

nrow, ncol = size(r)
new_r = [Float64(ifelse(isnan(rank[i,j]), NaN, r[i,j])) for i in 1:nrow, j in 1:ncol]

【问题讨论】:

    标签: sorting matrix mapping julia


    【解决方案1】:

    NaN 在 Julia 中并不“特殊”。它只是一个浮点值。如果您希望 NaN 被视为缺失值,则应首先将其转换为 missing,然后使用 StatsBase.jl 中的 ordinalrank 函数:

    julia> rank = [[1.0,2.0,NaN] [5.0,3.0,1.0]]
    3×2 Array{Float64,2}:
       1.0  5.0
       2.0  3.0
     NaN    1.0
    
    julia> using StatsBase
    
    julia> mapslices(rank; dims=1) do x
               ordinalrank(replace(x, NaN=>missing))
           end
    3×2 Array{Union{Missing, Int64},2}:
     1         3
     2         2
      missing  1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2019-06-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多