#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!
vsvcat
.
Ответ №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}}
.