Julia中向量的唯一元素索引

Ale*_*207 2 julia

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

例如,如果你有一个向量v = [1,2,1,3,5,3],那么唯一元素是[1,2,3,5] (输出unique)并且它们的索引是ind = [1,2,4,5].什么功能,可以让我计算ind,这样v[ind] = unique(v)

小智 11

另一个建议是

unique(i -> x[i], 1:length(x))
Run Code Online (Sandbox Code Playgroud)

这与接受的答案(在 Julia 1.1 中)中的函数一样快,但更简短一些。


Bog*_*ski 5

这是Julia 0.7的解决方案:

findfirst.(isequal.(unique(x)), [x])
Run Code Online (Sandbox Code Playgroud)

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

findfirst.(map(a -> (y -> isequal(a, y)), unique(x)), [x])
Run Code Online (Sandbox Code Playgroud)

和更短的版本(但它不会在Julia 0.7下工作):

findfirst.([x], unique(x))
Run Code Online (Sandbox Code Playgroud)

它可能不会是最快的.

如果你需要速度,你可以写一些类似的东西(应该在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
Run Code Online (Sandbox Code Playgroud)


nic*_*y12 5

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

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

它为vin 的每个唯一元素获取一个索引v。这些都在 base 中并在 0.6 中工作。这比@Bogumil 的函数慢大约 2.5 倍,但它是一个简单的替代方法。


ede*_*rag 5

mattswonBogumi\xc5\x82 Kami\xc5\x84ski答案的混合(谢谢!):

\n
uniqueidx(v) = unique(i -> v[i], eachindex(v))\n
Run Code Online (Sandbox Code Playgroud)\n

eachindex允许使用任何类型的数组,甚至视图。

\n
julia> v = [1,2,1,3,5,3];\n\njulia> uniqueidx(v)\n4-element Vector{Int64}:\n 1\n 2\n 4\n 5\n\njulia> v2 = reshape(v, 2, 3)\n2\xc3\x973 Matrix{Int64}:\n 1  1  5\n 2  3  3\n\njulia> subv2 = view(v2, 1:2, 1:2)\n2\xc3\x972 view(::Matrix{Int64}, 1:2, 1:2) with eltype Int64:\n 1  1\n 2  3\n\njulia> uniqueidx(subv2)\n3-element Vector{CartesianIndex{2}}:\n CartesianIndex(1, 1)\n CartesianIndex(2, 1)\n CartesianIndex(2, 2)\n
Run Code Online (Sandbox Code Playgroud)\n