sorting - 定义自定义 sortperm 函数

标签 sorting matrix mapping julia

在 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]

最佳答案

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

关于sorting - 定义自定义 sortperm 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791755/

相关文章:

c# - 将数组 A 中的操作排序序列应用到数组 B,重新排序

c++ - "basic"类的运算符重载

c - 如何移动最大数量的矩阵

c - 仅映射文件 C 的第一个字母

java - 如何正确设置hibernate单向一对一映射

c - qSort 对结构进行排序

java - 如何对 recyclerView 进行分组,在组之间添加分隔线并为每个组添加一个图标

sorting - Lua - 对表进行排序并随机化关系

python - 如何找到矩阵最后一行的最小值?

Spring MVC 3.0 映射扩展