Юлия: Как преобразовать вектор типа string в тип numeric (Float64) - PullRequest
0 голосов
/ 28 января 2019

В Julia 1.1 Я хочу преобразовать вектор типа string в тип numeric (Float64), вот этот вектор:

string = ["2.2", "3,3", "4.4"];

Я безуспешно пробовал следующую строку:

x = convert(Float64, string)
x = convert(DataVector{Float64}, string)
x = map(x->parse(Float64,x),string)
x = parse(Float64,string)
x = Float64(string)

1 Ответ

0 голосов
/ 28 января 2019

Самое простое:

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
...