gpt4 book ai didi

arrays - 在 Julia 中将一组数据帧转换为多维数组

转载 作者:行者123 更新时间:2023-12-05 03:40:48 25 4
gpt4 key购买 nike

[一个 Julia 菜鸟问题。]

假设我有一个数据帧向量,如下所示:

using DataFrames
A = DataFrame([8.1 9.2 7.5 6.6; 6.9 8.1 6.8 5.8])
B = DataFrame([9.0 2.1 5.2 5.3; 1.2 4.9 9.8 7.7])
dfs = [A, B]

当然,我在 dfs 中的数据帧数量实际上比在这个 MWE 中多得多,但它们都具有相同的维度,并且它们都只有数字列。

我想将 dfs 转换为多维(此处为 2x4x2)数组 arr,其中 arr[:, :, 1]等于 A,arr[:, :, 2] 等于 B。我如何执行此转换? (当然,for 循环可能可以解决问题,但我想还有一种更优雅的方法可以继续。)

谢谢!

最佳答案

我觉得

f1(dfs) = cat(Matrix.(dfs)..., dims=3)

是一种相当优雅的单行代码,但它分配的是临时变量。

从速度的角度来看,您可以使用以下单行代码轻松击败它

f2(dfs) = [ dfs[k][n,m] for n = 1:size(dfs[1],1), m = 1:size(dfs[1],2), k = 1:length(dfs) ]

话虽如此,如果您愿意更冗长一点,您可以使用专门为 DataFrame 设计的迭代协议(protocol)再次做得更好。

function f3(dfs)
y = Array{Float64,3}(undef, size(dfs[1],1), size(dfs[1],2), length(dfs))
for k = 1:length(dfs) ; for (n,col) in enumerate(eachcol(dfs[k]))
y[:,n,k] = col
end ; end
return y
end

作为一般规则,如果您想在 Julia 中提高速度,循环通常是最好的方法。让我们快速比较一下这三种方法:

julia> using BenchmarkTools

julia> @btime f1($dfs);
182.454 μs (132 allocations: 7.89 KiB)

julia> @btime f2($dfs);
935.217 ns (21 allocations: 672 bytes)

julia> @btime f3($dfs);
338.664 ns (11 allocations: 368 bytes)

所以 f3f1 快 6 倍。您可以在 f2f3 中添加一个 @inbounds 以进一步优化,尽管我怀疑它不会给您带来那么多......

现在,公平地说,我假设这里的一切都是 Float64。但是,通过预先进行快速类型检查,您可以将其泛化为任何类型(只要它都是一种类型 - 假设您想要转换为单个数组)。

关于arrays - 在 Julia 中将一组数据帧转换为多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68018709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com