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

时间:2019-01-27 23:11:38

标签: string vector type-conversion character julia

Julia 1.1中,我想将字符串类型的向量转换为数字类型(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 :(得分:4)

最简单的是:

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作为变量的名称,因为它将使Base的string函数黯然失色。

另外,如果您的原始字符串使用逗号作为小数点分隔符,则可以首先在其上运行replace,例如在这里,我通过矢量广播它:

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

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

EDIT :如Here所示,实际上写eiter快一点:

replace.(s, (','=>'.',))

replace.(s, Ref(','=>'.'))

一般规则是您正在广播,因为您使用了.,因此所有参数都应该是可广播的。由于Pair(在我们的情况下为','=>'.')不被视为可广播的,因此我们必须将其包装在一个可广播的单元素容器中。

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

您可以使用一个元素元组将此元素包装在(,)中(请注意)之前的逗号,如果没有它,该模式将无法正常工作)。这种方法不会分配内存。

最后,您可以使用内置的Ref函数,该函数将创建Base.RefValue{Pair{Char,Char}}类型的对象,在这种情况下,Julia将其视为一个0维的单元素容器(这是一个您可以在Julia手册的DNF中开始探讨一些更高级的主题)。这种方法也不会分配内存。

Julia手册中this section描述了您可以播放的内容。

其他情况:

字符串和缺失数组

为此,您需要最新的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,以向您显示解决方案不是{{1 }}特定,但通常可以摄取任何字符串或任何NaN):

Float64