将CSV读入阵列

v8wbuo2f  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(60)

在Julia中,使用CSV.jl,可以从.csv文件中读取DataFrame:

using CSV

df = CSV.read("data.csv", delim=",")

字符串
但是,如何将CSV文件读入Vector{Float64}数据类型?

ux6nzvsh

ux6nzvsh1#

您可以从stdlib使用DelimitedFiles模块:

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的文档字符串中,你可以找到更多关于可用选项的细节。
注意,你将得到Matrix{Float64}而不是Vector{Float64},但我知道这是你想要的。如果不是,那么为了将矩阵转换为向量,你可以在阅读数据后调用vec函数。

编辑

下面是如何使用CSV.jl读回Matrix

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

z31licg0

z31licg02#

您可以将DataFrame转换为特定类型的Matrix。如果没有丢失数据,这应该可以工作。如果有丢失数据,只需忽略convert中的类型。
arr = convert(Matrix{Float64}, df)
你可以在结果上调用vec来得到一个向量,如果这是你真正想要的。
根据文件的不同,我会选择readdlm,就像前面的回答中建议的那样。

olqngx59

olqngx593#

为了总结Bogumil的答案,你可以用途:

using DelimitedFiles
data = readdlm("data.csv", ',', Float64)

字符串

bjp0bcyl

bjp0bcyl4#

您可以通过以下命令让CSV.read使用Matrix作为其目的地:

julia> import CSV

julia> s = """
       1,2,3
       4,5,6
       7,8,9""";

julia> CSV.read(IOBuffer(s), CSV.Tables.matrix; header=false)
3×3 Matrix{Int64}:
 1  2  3
 4  5  6
 7  8  9

字符串
请注意,有一个currently-outstanding issue可以直接使用内置的Matrix类型本身作为“接收器”,这将使其更容易理解。

相关问题