Julia中向量唯一元素的索引

7
如何获取向量中唯一元素的索引?
例如,如果您有一个向量v = [1,2,1,3,5,3],那么唯一元素是[1,2,3,5](使用unique函数得出),它们的索引是ind = [1,2,4,5]。哪个函数可以让我计算出ind,使得v[ind] = unique(v)
4个回答

10
另一个建议是:
unique(i -> x[i], 1:length(x))

这段代码的执行速度与被接受的答案中的函数(在Julia 1.1中)差不多,但代码略微更简洁。


9
这是适用于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

5
如果您不关心找到每个唯一元素的第一个索引,那么可以使用uniqueindexin函数的组合:
julia> indexin(unique(v), v)
4-element Array{Int64,1}:
 3
 2
 6
 5

v中每个独特元素都会得到一个索引。这些都是在基础上工作的,适用于0.6版本。虽然比@Bogumil的功能慢大约2.5倍,但它是一个简单的替代方案。


谢谢,这也是一个很好的答案!我现在会在我的脚本中使用uniqueidx函数定义。但对于交互式使用,indexin函数非常方便。 - Alex338207
在 Julia 0.7 中,indexin 返回第一个匹配项的索引(而不是像 0.6 中返回最后一个)。 - Milan Bouchet-Valat

5

这是 mattswonBogumił Kamiński 答案的混合体(感谢!):

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

eachindex 允许您 处理任何类型的数组,甚至是视图。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接