Расширение списка векторов по спискам экземпляров - Юлия

Вопрос задан: 11 месяцев назад Последняя активность: 11 месяцев назад
up 0 down

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

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

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 5 down accepted

Если вы хорошо используете пакет (в основном, stdlib), вызывается функция, которую вы ищете inverse_rle в StatsBase.jl:

julia> using StatsBase

julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
 "a"
 "a"
 "a"
 "b"
 "b"
 "b"
 "b"
 "b"
 "d"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"
 "z"

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

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

Если вы хотите избежать посылок, вы можете, в принципе, транслировать 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)

Однако, поскольку Джулия позволяет вам писать быстрые циклы, вы можете легко определить свою собственную простую функцию. Следующее намного быстрее, чем ваше решение (так быстро, как реализация в StatsBase):

function multiply(vs, ns)
   r = Vector{String}(undef, sum(ns))
   c = 1
   @inbounds for i in axes(ns, 1)
       for k in 1:ns[i]
           r[c] = vs[i]
           c += 1
       end
   end
   r
end

Ориентир:

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)