以下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的值?
答案 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,但分配更多,并在整个向量中进行多次传递。