提取数组中的连续行

时间:2019-02-19 22:24:24

标签: python dataframe julia

以下python代码

df['tag'] = df['Value'] < 1.0 
df['mask'] = np.where(df['tag'],1,0)
first = df.index[df['tag'] & ~ df['tag'].shift(1).fillna(False)]
last = df.index[df['tag'] & ~ df['tag'].shift(-1).fillna(False)]
pr = [(i, j) for i, j in zip(first, last) if j > i + 1]

返回一个数组pr,该数组包含小于值1的连续行的元组。我试图按以下方式部分转换此Julia:

df[:tag]=df[:Value] .< 1.0
df[:mask]=zeros(length(df[:tag]))

df[:mask][df[:tag].==true] .= 1
df[:mask][df[:tag].==false] .= 0

如何在Julia中复制first,last,pr的值?

1 个答案:

答案 0 :(得分:1)

我将为您提供两种解决此问题的方法。第一个更快,但是需要更多代码。第二个比较慢,但是更短。

function getblocks1(vs)
    blocks = Tuple{Int, Int}[]
    inblock, start = false, 0, 0
    for (i, v) in enumerate(vs)
        if inblock
            if v >= 1.0
                push!(blocks, (start, i-1))
                inblock = false
            end
        else
            if v < 1.0
                start = i
                inblock = true
            end
        end
    end
    inblock && push!(blocks, (start, length(vs)))
    blocks
end

function getblocks2(vs)
    t = [false; vs .< 1.0; false]
    dt = diff(t)
    f = findall(==(1), dt)
    l = findall(==(-1), dt) .- 1
    collect(zip(f, l))
end

要知道的关键一点是,在Julia getblocks1中将很快,因为Julia中的循环很快,并且该函数试图使分配数最小化,并且一次完成所有操作。第二种实现更像Python,但分配更多,并在整个向量中进行多次传递。