按实例列表展开每个向量列表-Julia

按实例列表展开每个向量列表-Julia,julia,expand,Julia,Expand,我想用一个包含每个实例数量的向量来展开每个值的向量。我已经想出了下面的代码来完成这项工作,但似乎这是一个常见的用法,所以我可能遗漏了一些东西 valuelist = ["a","b","d","z"] numberofinstance = [3,5,1,11] valuevector = String[] for i in 1:length(numberofinstance) append!(valuevector , repeat([valuelist[i]], numberofins

我想用一个包含每个实例数量的向量来展开每个值的向量。我已经想出了下面的代码来完成这项工作,但似乎这是一个常见的用法,所以我可能遗漏了一些东西

valuelist = ["a","b","d","z"]
numberofinstance = [3,5,1,11]

valuevector = String[]
for i in 1:length(numberofinstance) 
  append!(valuevector , repeat([valuelist[i]], numberofinstance[i])) 
end

如果您对使用软件包(基本上是stdlib)很满意,那么您正在寻找的函数称为
inverse\rle

如果您想避免使用软件包,原则上可以像这样播放
repeat
^
(通电)

vcat(collect.(^(valuelist,numberofinstance))…)

但我认为这相对来说比较难解析,而且比
inverse\rle
要慢

julia> @btime yoursolution($valuelist, $numberofinstance);
  693.329 ns (13 allocations: 1.55 KiB)

julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
  472.615 ns (9 allocations: 800 bytes)
然而,由于Julia允许您编写快速循环,因此您可以轻松定义自己的简单函数。以下是比您的解决方案快得多的(与解决方案一样快):

基准:

julia> @btime yoursolution($valuelist, $numberofinstance);
  693.329 ns (13 allocations: 1.55 KiB)

julia> @btime multiply($valuelist, $numberofinstance);
  76.469 ns (1 allocation: 240 bytes)

如果您对使用软件包(基本上是stdlib)很满意,那么您正在寻找的函数称为
inverse\rle

如果您想避免使用软件包,原则上可以像这样播放
repeat
^
(通电)

vcat(collect.(^(valuelist,numberofinstance))…)

但我认为这相对来说比较难解析,而且比
inverse\rle
要慢

julia> @btime yoursolution($valuelist, $numberofinstance);
  693.329 ns (13 allocations: 1.55 KiB)

julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
  472.615 ns (9 allocations: 800 bytes)
然而,由于Julia允许您编写快速循环,因此您可以轻松定义自己的简单函数。以下是比您的解决方案快得多的(与解决方案一样快):

基准:

julia> @btime yoursolution($valuelist, $numberofinstance);
  693.329 ns (13 allocations: 1.55 KiB)

julia> @btime multiply($valuelist, $numberofinstance);
  76.469 ns (1 allocation: 240 bytes)

我在StatsBase.jl中找到了该函数。请参阅我的更新答案。我在StatsBase.jl中找到了该函数。请参阅我的最新答案。