Julia 根据条件将向量分割为子向量的惯用方法

Mat*_*ský 2 idioms julia

假设我有一个向量a = [1, 0, 1, 2, 3, 4, 5, 0, 5, 6, 7, 8, 0, 9, 0],我想根据该数组中的值的条件将其分割为更小的向量。例如值为零。\n因此我想获得以下向量的向量

\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

到目前为止,这对我来说是一个幼稚的解决方案,但它失去了类型。

\n
function 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

然后我尝试使用范围,感觉更惯用一点,并且不会丢失类型。

\n
function 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

Prz*_*fel 5

也许有人有一个更短的想法,但这是我的:

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)