Самое простое:
julia> s = ["2.2", "3.3", "4.4"];
julia> parse.(Float64, s)
3-element Array{Float64,1}:
2.2
3.3
4.4
, но map
также будет работать:
julia> map(x->parse(Float64,x), s)
3-element Array{Float64,1}:
2.2
3.3
4.4
Проблема в вашем исходном примере состоит из двух частей:
- вторая строка
"3,3"
является недопустимым Floa64
числом (имеет неправильный десятичный разделитель); - , пока он действителен, я бы рекомендовал вам не использовать
string
в качестве имени переменной, так какбудет затенять string
функцию от Base.
Кроме того, если ваши исходные строки имеют запятую в качестве десятичного разделителя, тогда вы можете сначала запустить replace
на них, например, здесь я передаю их по вектору:
julia> s = ["2.2", "3,3", "4,4"];
julia> replace.(s, [','=>'.'])
3-element Array{String,1}:
"2.2"
"3.3"
"4.4"
РЕДАКТИРОВАТЬ : как указано DNF , на самом деле немного быстрее писать eiter:
replace.(s, (','=>'.',))
или
replace.(s, Ref(','=>'.'))
Общее правило: вы делаете трансляцию, потому что вы использовали .
, поэтому все ваши аргументы должны быть транслируемыми.Поскольку Pair
, в нашем случае ','=>'.'
, не рассматривается как широковещательный, мы должны заключить его в одноэлементный контейнер, который можно транслировать.
Первым подходом было заключить его в одинмассив элементов с использованием [
и ]
, что немного неэффективно, поскольку он выделяет новый временный массив.
Для этого можно использовать кортеж из одного элемента, оборачивая его в (
и ,)
(запишите запятую перед )
, без нее шаблон будет работать некорректно).При таком подходе память не выделяется.
Наконец, вы можете использовать встроенную функцию Ref
, которая в этом случае создаст объект типа Base.RefValue{Pair{Char,Char}}
, который Юлия считает 0-мерным.Контейнер элементов (это немного более сложная тема, которую вы можете начать изучать в этом разделе руководства Julia).При таком подходе также не выделяется память.
О том, что вы можете транслировать, описано здесь в руководстве Юлии.
Дополнительные случаи:
Массив строк и пропусков
Для этого вам понадобится последний файл Missings.jl (запустите команду up
в диспетчере пакетов):
julia> s = ["2.2", "3.3", "4.4", missing]
4-element Array{Union{Missing, String},1}:
"2.2"
"3.3"
"4.4"
missing
julia> passmissing(parse).(Float64, s)
4-element Array{Union{Missing, Float64},1}:
2.2
3.3
4.4
missing
Массив строки NaN
Это не должно происходить на практике, поскольку вы пропускаете строки и числа с плавающей точкой в одном векторе, но вы можете сделать это следующим образом (я добавил 5.5
к вектору, чтобы показать вамчто решение не является NaN
конкретным, но в целом может потреблять любую строку или любую Float64
):
julia> s = ["2.2", "3.3", "4.4", NaN, 5.5]
5-element Array{Any,1}:
"2.2"
"3.3"
"4.4"
NaN
5.5
julia> [v isa Float64 ? v : parse(Float64, v) for v in s]
5-element Array{Float64,1}:
2.2
3.3
4.4
NaN
5.5