在 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)
最佳答案
最简单的是:
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}}
类型的对象在这种情况下,Julia 将其视为 0 维单元素容器(这是一个更高级的主题,您可以在 Julia 手册的 this section 中开始探索)。这种方法也不会分配内存。关于你可以广播的内容描述here在 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
关于string - Julia : How to convert vector of type string to type numeric (Float64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393762/