如何获取向量的唯一元素的索引?
例如,如果你有一个向量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 中)中的函数一样快,但更简短一些。
这是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)
如果您不关心为每个唯一元素查找第一个索引,那么您可以使用unique和indexin函数的组合:
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 倍,但它是一个简单的替代方法。
mattswon和Bogumi\xc5\x82 Kami\xc5\x84ski答案的混合(谢谢!):
\nuniqueidx(v) = unique(i -> v[i], eachindex(v))\nRun Code Online (Sandbox Code Playgroud)\n\njulia> 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)\nRun Code Online (Sandbox Code Playgroud)\n