我是朱莉娅的新手,我不知道如何删除数组中的连续重复项。例如,如果你采用这个数组:
`v=[8,8,8,9,5,5,8,8,1];`
我想获得向量v1,以便:
v1 = [8,9,5,8,1];
有人能帮帮我吗?非常感谢。
答案 0 :(得分:8)
一种方法可以是定义:
function fastuniq(v)
v1 = Vector{eltype(v)}()
if length(v)>0
laste = v[1]
push!(v1,laste)
for e in v
if e != laste
laste = e
push!(v1,laste)
end
end
end
return v1
end
使用此功能,您有:
julia> println(fastuniq(v))
[8,9,5,8,1]
但是,在处理数组时,需要确定元素是深复制还是浅复制。在整数的情况下,没关系。
答案 1 :(得分:7)
在StatsBase.jl
中,有一个rle
函数(运行长度编码)就是这样做的。
答案 2 :(得分:4)
在精神@ niczky12单线解决方案目标中,以下使用Iterators.jl
包(非常有用且慢慢迁移到Base)。
using Iterators # install with Pkg.add("Iterators")
neatuniq(v) = map(first,filter(p->p[1]!=p[2],partition(chain(v,[nothing]),2,1)))
没有做任何基准测试,但它应该没问题(但比基于for
的更长的功能慢)。
答案 3 :(得分:2)
只是为了练习...
这是您可以用来执行此操作的另一个小函数,此函数仅适用于非负值(包括0)。
function anotherone(v)
v1 = zeros(eltype(v),length(v))
v1[1]=v[1]+1
for e = 2:length(v)
if v[e] != v[e-1]
v1[e] = v[e]+1
end
end
return v1[find(v1)]-1
end
编辑:
根据评论中的输入添加一个版本。我认为这个应该更快,也许你可以测试一下:)这个版本也适用于负数。
function anotherone(v)
v1 = falses(length(v))
v1[1]=true
for e = 2:length(v)
if v[e] != v[e-1]
v1[e] = true
end
end
return v[v1]
end