String 朱莉娅:如何将字符串类型的向量转换为数字类型(Float64)
在String 朱莉娅:如何将字符串类型的向量转换为数字类型(Float64),string,vector,type-conversion,character,julia,String,Vector,Type Conversion,Character,Julia,在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
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)
最简单的是:
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
replace
,例如,在这里,我通过向量广播它:
julia> s = ["2.2", "3,3", "4,4"];
julia> replace.(s, [','=>'.'])
3-element Array{String,1}:
"2.2"
"3.3"
"4.4"
编辑:如图所示,写入eiter实际上要快一点:
replace.(s, (','=>'.',))
或
一般规则是,您之所以进行广播,是因为您使用了
,所以所有参数都应该是可广播的。因为对
,在我们的例子中,,'=>'.
,不被视为可广播的,所以我们必须将其包装在可广播的单元素容器中
第一种方法是使用[
和]
将其包装在一个元素数组中,这有点低效,因为它分配了一个新的临时数组
您可以使用一个元素元组将其包装在(
和,)
(请注意前面的逗号)
,没有它,模式将无法正常工作)。这种方法不会分配内存
最后,您可以使用一个内置的Ref
函数,它将创建一个类型为Base.RefValue{Pair{Char,Char}}
的对象,在这种情况下,Julia将其视为一个0维的单元素容器(这是一个更高级的主题,您可以在Julia手册的部分中开始探索)。这种方法也不会分配内存
Julia手册中描述了您可以广播的内容
其他案件:
字符串和缺失的数组
为此,您需要最新的Missings.jl(在包管理器中运行up
命令):
字符串数组和NaN
这在实践中不应该发生,因为在一个向量中缺少字符串和浮动,但您可以这样做(我在向量中添加了5.5
,以显示解决方案不是NaN
特定的,但通常可以接受任何字符串或任何Float64
):
非常感谢@BogumiłKamiński给出非常明确的答案。实际上,我刚刚在我真正的问题上尝试了一下:在数据帧上,我有一个类型为
s=[“2.2”、“3.3”、“4.4”,缺少]
的列。有没有办法将字符串s
转换为Float64
(如果我有s=[“2.2”,“3.3”,“4.4”,NaN]
),答案会是相同的吗?我已经在答案中添加了处理这些情况的示例。非常感谢@BogumiłKamiński。带有NaN
的示例工作得很好,但是,在安装了Missings
之后,使用Missings键入,然后s=[“2.2”、“3.3”、“4.4”,missing]
和passmissing(parse)。(Float64,s)
,我得到UndefVarError:passmissing未定义的Stacktrace:[1]无的顶级作用域:0
非常细微的挑剔:在replace.(s,[','=>'.]]
或元组中包装replace对不是更好,而不是分配向量?虽然性能差异很小,但我相信使用Ref
是正常的建议。我可以理解这一点。尽管元组应该尽快引入,因为它们到处都有。
replace.(s, Ref(','=>'.'))
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
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