假设我有一个向量a = [1, 0, 1, 2, 3, 4, 5, 0, 5, 6, 7, 8, 0, 9, 0]
,我想根据该数组中的值的条件将其分割为更小的向量。例如值为零。\n因此我想获得以下向量的向量
[1, 0]\n [1, 2, 3, 4, 5, 0]\n [5, 6, 7, 8, 0]\n [9, 0]\n
Run Code Online (Sandbox Code Playgroud)\n到目前为止,这对我来说是一个幼稚的解决方案,但它失去了类型。
\nfunction split_by_\xce\xbb(a::Vector, \xce\xbb)\n b = []\n temp = []\n for i in a\n push!(temp, i)\n if \xce\xbb(i)\n push!(b, temp)\n temp = []\n end\n end\n b\nend\nsplit_by_\xce\xbb(a, isequal(0))\n
Run Code Online (Sandbox Code Playgroud)\n然后我尝试使用范围,感觉更惯用一点,并且不会丢失类型。
\nfunction split_by_\xce\xbb(a::Vector, \xce\xbb)\n idx = findall(\xce\xbb, a)\n ranges = [(:)(i==1 ? 1 : idx[i-1]+1, idx[i]) for i in eachindex(idx)]\n map(x->a[x], ranges)\nend\n\nsplit_by_\xce\xbb(a, isequal(0))\n
Run Code Online (Sandbox Code Playgroud)\n但它仍然感觉非常麻烦,因为这是一个相当简单的任务。\n我是否缺少一些东西,一些更简单的方法?
\n也许有人有一个更短的想法,但这是我的:
julia> inds = vcat(0,findall(==(0),a),length(a))
julia> getindex.(Ref(a), (:).(inds[1:end-1].+1,inds[2:end]))
5-element Array{Array{Int64,1},1}:
[1, 0]
[1, 2, 3, 4, 5, 0]
[5, 6, 7, 8, 0]
[9, 0]
[]
Run Code Online (Sandbox Code Playgroud)
或者如果您想避免复制a
julia> view.(Ref(a), (:).(inds[1:end-1].+1,inds[2:end]))
5-element Array{SubArray{Int64,1,Array{Int64,1},Tuple{UnitRange{Int64}},true},1}:
[1, 0]
[1, 2, 3, 4, 5, 0]
[5, 6, 7, 8, 0]
[9, 0]
0-element view(::Array{Int64,1}, 16:15) with eltype Int64
Run Code Online (Sandbox Code Playgroud)