将CSV读入数组

将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

在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"""
"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”、`、`)```对,我希望最初的例子是可复制的,而无需将任何内容写入磁盘。