Julia中向量的唯一元素索引

时间:2018-06-17 19:52:05

标签: julia

如何获取向量的唯一元素的索引?

例如,如果您有一个向量v = [1,2,1,3,5,3],则唯一元素为[1,2,3,5]unique的输出),其索引为ind = [1,2,4,5]。什么功能允许我计算ind以便v[ind] = unique(v)

4 个答案:

答案 0 :(得分:5)

这是Julia 0.7的解决方案:

findfirst.(isequal.(unique(x)), [x])

或类似的工作在Julia 0.6.3和Julia 0.7:

findfirst.(map(a -> (y -> isequal(a, y)), unique(x)), [x])

和更短版本(但在Julia 0.7下不起作用):

findfirst.([x], unique(x))

可能不会是最快的。

如果你需要速度,你可以写一些类似的东西(应该在Julia 0.7和0.6.3下都有效):

function uniqueidx(x::AbstractArray{T}) where T
    uniqueset = Set{T}()
    ex = eachindex(x)
    idxs = Vector{eltype(ex)}()
    for i in ex
        xi = x[i]
        if !(xi in uniqueset)
            push!(idxs, i)
            push!(uniqueset, xi)
        end
    end
    idxs
end

答案 1 :(得分:3)

如果您不关心为每个唯一元素找到第一个索引,那么您可以使用uniqueindexin函数的组合:

julia> indexin(unique(v), v)
4-element Array{Int64,1}:
 3
 2
 6
 5

vv的每个唯一元素获取一个索引。这些都是基础,工作在0.6。这比@ Bogumil的功能慢约2.5倍,但它只是一个简单的选择。

答案 2 :(得分:3)

另一个建议是

unique(i -> x[i], 1:length(x))

与接受的答案(在Julia 1.1中)的功能一样快,但是要简短一些。

答案 3 :(得分:1)

mattswonBogumił Kamiński 之间的混合答案(谢谢!):

uniqueidx(v) = unique(i -> v[i], eachindex(v))

eachindex 允许 work with any kind of array,甚至视图。

julia> v = [1,2,1,3,5,3];

julia> uniqueidx(v)
4-element Vector{Int64}:
 1
 2
 4
 5

julia> v2 = reshape(v, 2, 3)
2×3 Matrix{Int64}:
 1  1  5
 2  3  3

julia> subv2 = view(v2, 1:2, 1:2)
2×2 view(::Matrix{Int64}, 1:2, 1:2) with eltype Int64:
 1  1
 2  3

julia> uniqueidx(subv2)
3-element Vector{CartesianIndex{2}}:
 CartesianIndex(1, 1)
 CartesianIndex(2, 1)
 CartesianIndex(2, 2)