如何获取向量的唯一元素的索引?
例如,如果您有一个向量v = [1,2,1,3,5,3]
,则唯一元素为[1,2,3,5]
(unique
的输出),其索引为ind = [1,2,4,5]
。什么功能允许我计算ind
以便v[ind] = unique(v)
?
答案 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)
如果您不关心为每个唯一元素找到第一个索引,那么您可以使用unique
和indexin
函数的组合:
julia> indexin(unique(v), v)
4-element Array{Int64,1}:
3
2
6
5
为v
中v
的每个唯一元素获取一个索引。这些都是基础,工作在0.6。这比@ Bogumil的功能慢约2.5倍,但它只是一个简单的选择。
答案 2 :(得分:3)
另一个建议是
unique(i -> x[i], 1:length(x))
与接受的答案(在Julia 1.1中)的功能一样快,但是要简短一些。
答案 3 :(得分:1)
mattswon 和 Bogumił 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)