Извлечение смежных строк в массив - PullRequest
0 голосов
/ 20 февраля 2019

Следующий код на 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. Я попытался перевести эту Джулию в некоторой степени следующим образом:

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

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

Как мне скопировать значения для первого, последнего, pr в Юлии?

1 Ответ

0 голосов
/ 20 февраля 2019

Я дам вам два возможных подхода к этой проблеме.Первый быстрее, но требует немного больше кода.Второй медленнее, но короче.

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, но выделяет больше и делает несколько проходов через весь вектор.

...