Как преобразовать переменную типа «SentinelArrays» в «Массивы{Float64,n}» в julia

#variables #type-conversion #julia

#переменные #преобразование типа #джулия

Вопрос:

Я пытаюсь оптимизировать свой код Julia, сделав его стабильным по типу. Следовательно, я попытался объявить типы переменных в заголовках функций. Но одна из переменных имеет тип ::SentinelArrays.ChainedVector{Float64,Array{Float64,1}} , как показано во фрагменте кода ниже.

Пример кода:

 df=CSV.read("text.csv", DataFrame)

a = view(df, :, 1)      
#this has a type of ::SentinelArrays.ChainedVector{Float64,Array{Float64,1}}

b = view(df, :, 2:4)
#while type of this is ::Arrays{Float64,2}

#I would like to pass the type of the arrays in the function.
function calc(a, b::Arrays{Float64,2})
    a b
end
 

Однако я попытался передать typeof(a) в function calc(a::SentinelArrays.ChainedVector{Float64,Array{Float64,1}}, b::Arrays{Float64,2}) , это выдает ошибку no method matching .
Могу ли я узнать правильный способ присвоения этого типа или, может быть, если можно преобразовать это в обычный Array{Float64,1} .
Пожалуйста, предложите решение этой проблемы. Заранее спасибо.

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

1. Черт возьми, я не думаю, что аннотирование типов аргументов вашей функции поможет повысить стабильность типов. Как правило, я думаю, что лучше всего аннотировать эти типы только тогда, когда у вас есть несколько методов и вы используете множественную отправку.

Ответ №1:

Вы можете просто написать Array(a) , где a ваш SentinelArray as здесь:

 julia> u = SentinelArray(rand(1:8,4))
4-element SentinelVector{Int64, Int64, Missing, Vector{Int64}}:
 2
 3
 5
 3

julia> Array(u)
4-element Vector{Union{Missing, Int64}}:
 2
 3
 5
 3
 

Однако обычно вы просто делаете сигнатуру функции примерно такой:

 function calc(a, b::AbstractArray{T,2}) where T
 

потому что это будет работать с обоими этими типами:

 julia> SentinelMatrix{Int64, Int64, Missing, Matrix{Int64}} <: AbstractArray{T,2} where T
true