通过在Julia中重复旧数组的某些行来创建新数组

通过在Julia中重复旧数组的某些行来创建新数组,julia,Julia,假设我有一个数组: julia> a = [1 1; 2 2; 3 3; 4 4; 5 5; 6 6; 7 7;] 7×2 Array{Int64,2}: 1 1 2 2 3 3 4 4 5 5 6 6 7 7 我制作了一个向量,指定每行在新数组中重复的次数: julia> r = [0; 2; 0; 4; 0; 1; 0;] 7-element Array{Int64,1}: 0 2 0 4 0 1 0 我想要的输出是: julia&g

假设我有一个数组:

julia> a = [1 1; 2 2; 3 3; 4 4; 5 5; 6 6; 7 7;]
7×2 Array{Int64,2}:
 1  1
 2  2
 3  3
 4  4
 5  5
 6  6
 7  7
我制作了一个向量,指定每行在新数组中重复的次数:

julia> r = [0; 2; 0; 4; 0; 1; 0;]
7-element Array{Int64,1}:
 0
 2
 0
 4
 0
 1
 0
我想要的输出是:

julia> a_repeated = [2 2; 2 2; 4 4; 4 4; 4 4; 4 4; 6 6;]
7×2 Array{Int64,2}:
 2  2
 2  2
 4  4
 4  4
 4  4
 4  4
 6  6

我怎么去那里?我想我会使用这个函数,但我似乎不明白
内部
外部
是如何工作的

我们可以使用
repeat
和数组理解来获得结果:

julia> a[2,:]'
1×2 Array{Int64,2}:
 2  2

# inner=(2,1)
# 2: repeat twice in the first dimension
# 1: don't repeat in the second dimension
julia> repeat(a[2,:]', inner=(2,1)) 
2×2 Array{Int64,2}:          
 2  2
 2  2

# returns empty array
julia> repeat(a[2,:]', inner=(0,1))
0×2 Array{Int64,2}

julia> vcat([repeat(a[i,:]', inner=(r[i],1)) for i in indices(a,1)]...)
7×2 Array{Int64,2}:
 2  2
 2  2
 4  4
 4  4
 4  4
 4  4
 6  6
使用,这是简单而高效的。不过,它已经被弃用了,所以我将把它拉出来,自己定义它:

function rep(x::AbstractVector, lengths::AbstractVector{T}) where T <: Integer
    if length(x) != length(lengths)
        throw(DimensionMismatch("vector lengths must match"))
    end
    res = similar(x, sum(lengths))
    i = 1
    for idx in 1:length(x)
        tmp = x[idx]
        for kdx in 1:lengths[idx]
            res[i] = tmp
            i += 1
        end
    end
    return res
end

非常感谢。我选择这个答案是因为它比另一个大数组的答案快得多。是否可以更新这个答案,@Matt B。?现在的Julia似乎不再喜欢rep函数的语法了。谢谢,我很高兴在一行中看到如何做到这一点。另一个答案在我的机器上更快,所以我选择了它。X-ref:
julia> idxs = rep(axes(a, 1), r)
7-element Array{Int64,1}:
 2
 2
 4
 4
 4
 4
 6

julia> a[idxs, :]
7×2 Array{Int64,2}:
 2  2
 2  2
 4  4
 4  4
 4  4
 4  4
 6  6