Julia:如何将字符串类型的向量转换为数字类型 (Float64)

ecj*_*cjb 2 string vector character type-conversion julia

Julia 1.1我想将字符串类型的向量转换为数字类型(Float64)时,这里是向量:

string = ["2.2", "3,3", "4.4"];
Run Code Online (Sandbox Code Playgroud)

我尝试了以下行但没有成功:

x = convert(Float64, string)
x = convert(DataVector{Float64}, string)
x = map(x->parse(Float64,x),string)
x = parse(Float64,string)
x = Float64(string)
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 5

最简单的是:

julia> s = ["2.2", "3.3", "4.4"];

julia> parse.(Float64, s)
3-element Array{Float64,1}:
 2.2
 3.3
 4.4
Run Code Online (Sandbox Code Playgroud)

map也可以工作:

julia> map(x->parse(Float64,x), s)
3-element Array{Float64,1}:
 2.2
 3.3
 4.4
Run Code Online (Sandbox Code Playgroud)

原始示例中的问题是双重的:

  • 第二个字符串"3,3"无效Floa64数字(它有一个错误的十进制分隔符);
  • 虽然有效,但我建议您不要将其string用作变量的名称,因为它会掩盖stringBase 中的函数。

此外,如果您的原始字符串有逗号作为十进制分隔符,那么您可以先运行replace它们,例如,我在这里通过向量广播它:

julia> s = ["2.2", "3,3", "4,4"];

julia> replace.(s, [','=>'.'])
3-element Array{String,1}:
 "2.2"
 "3.3"
 "4.4"
Run Code Online (Sandbox Code Playgroud)

编辑:如DNF所示,编写eiter实际上要快一点:

replace.(s, (','=>'.',))
Run Code Online (Sandbox Code Playgroud)

或者

replace.(s, Ref(','=>'.'))
Run Code Online (Sandbox Code Playgroud)

一般规则是您正在进行广播,因为您使用了 a,.因此您的所有参数都应该是可广播的。因为Pair在我们的例子中,a','=>'.'不被视为可广播的,所以我们必须将它包装在一个可广播的单元素容器中。

第一种方法是使用[和将其包装在一个元素数组中]这有点低效,因为它分配了一个新的临时数组。

您可以使用单元素元组将其包裹在(and ,)(注意前面的逗号),没有它,模式将无法正常工作)。这种方法不会分配内存。

最后,你可以使用一个内置的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
Run Code Online (Sandbox Code Playgroud)

字符串数组和 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
Run Code Online (Sandbox Code Playgroud)

  • 我能理解。尽管应该尽快引入元组,因为它们到处都是。 (2认同)