将CSV读入数组
在Julia中,使用,可以从将CSV读入数组,csv,julia,Csv,Julia,在Julia中,使用,可以从.csv文件中读取数据帧: using CSV df = CSV.read("data.csv", delim=",") 但是,如何将CSV文件读入向量{Float64}数据类型?您可以使用stdlib中的分隔文件模块: julia> using DelimitedFiles julia> s = """ 1,2,3 4,5,6 7,8,9
.csv
文件中读取数据帧:
using CSV
df = CSV.read("data.csv", delim=",")
但是,如何将CSV文件读入
向量{Float64}
数据类型?您可以使用stdlib中的分隔文件
模块:
julia> using DelimitedFiles
julia> s = """
1,2,3
4,5,6
7,8,9"""
"1,2,3\n4,5,6\n7,8,9"
julia> b = IOBuffer(s)
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=17, maxsize=Inf, ptr=1, mark=-1)
julia> readdlm(b, ',', Float64)
3×3 Array{Float64,2}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
我向您展示了从IOBuffer
读取数据的示例,它是完全可复制的,但您也可以从文件中读取数据。在readdlm
的文档字符串中,您可以找到有关可用选项的更多详细信息
注意,您将得到矩阵{Float64}
而不是向量{Float64}
,但我知道这是您想要的。如果没有,则为了将矩阵转换为向量,您可以在读取中的数据后对其调用vec
函数
编辑
这就是如何使用CSV.jl读回矩阵的方法:
julia> df = DataFrame(rand(2,3))
2×3 DataFrame
│ Row │ x1 │ x2 │ x3 │
│ │ Float64 │ Float64 │ Float64 │
├─────┼───────────┼──────────┼──────────┤
│ 1 │ 0.0444818 │ 0.570981 │ 0.608709 │
│ 2 │ 0.47577 │ 0.675344 │ 0.500577 │
julia> CSV.write("test.csv", df)
"test.csv"
julia> CSV.File("test.csv") |> Tables.matrix
2×3 Array{Float64,2}:
0.0444818 0.570981 0.608709
0.47577 0.675344 0.500577
您可以将
数据帧
转换为特定类型的矩阵
。如果没有丢失的数据,这应该是有效的。如果缺少数据,只需省略convert
中的类型即可
arr=convert(矩阵{Float64},df)
如果确实需要向量,可以对结果调用vec
根据文件的不同,我将使用前面答案中建议的
readdlm
。要总结Bogumil的答案,您可以使用:
using DelimitedFiles
data = readdlm("data.csv", ',', Float64)
这种方法也很好,请注意,您甚至可以简单地编写
矩阵{Float64}(df)
。不幸的是,CSV无法直接创建一个数组作为其输出,而无需先通过数据帧。我认为CSV是Julia最快的CSV阅读器,但不一定是生成数组的最快方式。生成数组是一种常见的场景。我在回答中添加了一个编辑,向您展示了如何在不使用中间数据帧的情况下获得矩阵
。您只需获取CSV.File(CSV行对象)的输出,并将其用作矩阵()构造函数的输入。这正是管道版本所做的。对CSV Rows对象的性能感到好奇,它是一个命名元组数组。我发现命名元组不是速度恶魔。看起来我们应该把CSV解析的速度提升移植到readdlm中。然后我们有两种非常好的快速方法:一种倾向于支持阵列,另一种倾向于支持DFs。两者都是可取的。也许有一个更简单的例子:``使用DelimitedFiles mat=readdlm(“data.csv”、`、`)```对,我希望最初的例子是可复制的,而无需将任何内容写入磁盘。