Создание вектора целых чисел и пропущенных значений

#julia

#julia

Вопрос:

Что за ерунда…

Я пытаюсь создать вектор из integer s и missing значений. Это работает нормально:

 b = [4, missing, missing, 3]
  

Но я бы на самом деле хотел, чтобы вектор был длиннее с большим missing количеством значений и, следовательно, использовался repeat() , но это не работает

 append!([1,2,3], repeat([missing], 1000))
  

и это тоже не работает

 [1,2,3, repeat([missing], 1000)]
  

Пожалуйста, помогите мне здесь.

Комментарии:

1. Я предлагаю писать fill(missing, 1000) , а не repeat([missing], 1000) . Это более идиоматично, и на моем компьютере, по крайней мере, примерно в 200 раз быстрее.

2. Хорошая мысль. Спасибо.

Ответ №1:

Также стоит отметить, что если вам не нужно выполнять операцию на месте с append! actually, в таких случаях гораздо проще выполнить вертикальную конкатенацию:

 julia> [[1, 2, 3]; repeat([missing], 2); 4; 5] # note ; that denotes vcat
7-element Array{Union{Missing, Int64},1}:
 1
 2
 3
  missing
  missing
 4
 5

julia> vcat([1,2,3], repeat([missing], 2), 4, 5) # this is the same but using a different syntax
7-element Array{Union{Missing, Int64},1}:
 1
 2
 3
  missing
  missing
 4
 5
  

Преимущество vcat заключается в том, что он автоматически выполняет продвижение типа (в отличие append! от того, в каком случае вы должны правильно указать eltype целевой контейнер перед операцией).


Обратите внимание, что из-за vcat автоматического продвижения типа в угловых случаях вы можете получить другой eltype результат операции:

 julia> x = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> append!(x, [1.0, 2.0]) # conversion from Float64 to Int happens here
5-element Array{Int64,1}:
 1
 2
 3
 1
 2

julia> [[1, 2, 3]; [1.0, 2.0]] # promotion of Int to Float64 happens in this case
5-element Array{Float64,1}:
 1.0
 2.0
 3.0
 1.0
 2.0
  

Смотрите также https://docs.julialang.org/en/v1/manual/arrays/#man-array-literals .

Комментарии:

1. Спасибо. Несмотря на то, что оба ответа работают, я думаю, что это более элегантный вариант. (Это может быть так, поскольку я родом из R .)

2. И обычно это предпочтительный подход (если вы не хотите выполнять обновление существующей коллекции на месте). Я добавил небольшое примечание, которое, я надеюсь, покажет вам краеугольный сценарий, о котором следует помнить при принятии решения об использовании append! vs vcat .

Ответ №2:

Это будет работать:

 append!(Union{Int,Missing}[1,2,3], repeat([missing], 1000))
  

[1,2,3] создает только a Vector{Int} , и поскольку Julia строго типизирована Vector{Int} , она не может принимать значения, отличные Int от type . Следовательно, при определении структуры, в которой вы планируете хранить больше типов данных, вам необходимо явно указать это — здесь мы определили Vector{Union{Int,Missing}} .