在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)
答案 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