maoc
1
I am trying to sort an array according other array. More specifically, sort ε_ according Z.
NN = 6
Z = rand(NN)
ε_= rand(NN)
teste = [ Z[sortperm(Z)] ε_[sortperm(ε_)] ]
test_f(Z) = teste[teste[:,1] .== Z , 2]
ε_ = test_f.(Z)
I believe there is a solution in fewer lines.
first.(sort(collect(zip(ε_,Z)),by=last))
1 Like
maoc
4
No. It is the same that
ε_[ sortperm(Z) , :]
But my goal is different. You can run my script and will see that it is not the same goal.
maoc
5
No. my goal is different. You can run my script and will see that it is not the same goal.
Picking easier to read random things, I think this is a less convoluted way to get the same answer:
julia> Z = rand(Int8, 6); println(Z)
Int8[68, -64, -110, 95, -116, 81]
julia> ε_ = rand('a':'z', 6); println(ε_)
['i', 'b', 'u', 'k', 'v', 'j']
julia> teste = [ Z[sortperm(Z)] ε_[sortperm(ε_)] ]
6×2 Matrix{Any}:
-116 'b'
-110 'i'
-64 'j'
68 'k'
81 'u'
95 'v'
julia> test_f(Z) = teste[teste[:,1] .== Z , 2]
test_f (generic function with 1 method)
julia> test_f.(Z) # desired result?
6-element Vector{Vector{Any}}:
['k']
['j']
['i']
['v']
['b']
['u']
julia> ε_[sortperm(Z)] |> println # "sort an array according other array"
['v', 'u', 'b', 'i', 'j', 'k']
julia> sort(ε_)[invperm(sortperm(Z))] |> println # more direct way?
['k', 'j', 'i', 'v', 'b', 'u']
2 Likes
Similar result but different output array type, just in case:
test_f2(Z) = teste[indexin(Z,teste[:,1]),2]
test_f2(Z)
6-element Vector{Any}:
'k': ASCII/Unicode U+006B (category Ll: Letter, lowercase)
'j': ASCII/Unicode U+006A (category Ll: Letter, lowercase)
'i': ASCII/Unicode U+0069 (category Ll: Letter, lowercase)
'v': ASCII/Unicode U+0076 (category Ll: Letter, lowercase)
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
'u': ASCII/Unicode U+0075 (category Ll: Letter, lowercase)
1 Like