朱莉娅重塑多暗阵列的最佳方法

时间:2014-05-23 15:02:14

标签: dataframe reshape julia

我有一个多维数组:

julia> sim1.value[1:5,:,:]
5x3x3 Array{Float64,3}:
[:, :, 1] =
  0.201974   0.881742  0.497407
  0.0751914  0.921308  0.732588
 -0.109084   1.06304   1.15962 
 -0.0149133  0.896267  1.22897 
  0.717094   0.72558   0.456043

[:, :, 2] =
  1.28742  0.760712  1.61112
  2.21436  0.229947  1.87528
 -1.66456  1.46374   1.94794
 -2.4864   1.84093   2.34668
 -2.79278  1.61191   2.22896

[:, :, 3] =
 0.649675  0.899028  0.628103
 0.718837  0.665043  0.153844
 0.914646  0.807048  0.207743
 0.612839  0.790611  0.293676
 0.759457  0.758115  0.280334

我在

中有第二个维度的名称
julia> sim1.names
3-element Array{String,1}:
 "beta[1]"
 "beta[2]"
 "s2" 

最好的方法是重塑这个多暗阵列,以便我有一个数据框,如:

 beta[1]  | beta[2]   | s2       | chain
 0.201974 |  0.881742 | 0.497407 |   1
 0.0751914|  0.921308 | 0.732588 |   1
-0.109084 |  1.06304  | 1.15962  |   1
-0.0149133|  0.896267 | 1.22897  |   1
 ...      |  ...      | ...      |   ...
 1.28742  |  0.760712 | 1.61112  |   2
 2.21436  |  0.229947 | 1.87528  |   2
-1.66456  |  1.46374  | 1.94794  |   2
-2.4864   |  1.84093  | 2.34668  |   2
-2.79278  |  1.61191  | 2.22896  |   2
 ...      |  ...      | ...      |   ...

2 个答案:

答案 0 :(得分:3)

目前,我认为最好的方法是混合使用循环并调用reshape

using DataFrames
A = randn(5, 3, 3)

df = DataFrame()
for j in 1:3
  df[j] = reshape(A[:, :, j], 5 * 3)
end

names!(df, [:beta1, :beta2, :s2])

答案 1 :(得分:0)

查看您的数据,似乎您希望基本上将sim1.value[1:5,:,:]的三个矩阵输出叠加在一起,并添加另一个具有矩阵索引的列。精彩而尊敬的John Myles White接受的答案似乎将每个矩阵的全部内容都放入了自己的专栏中。

以下内容与您使用vcat进行堆叠以及hcatfill添加额外列的所需输出相匹配。 JMW我肯定会知道是否有更好的方法:)

using DataFrames
A = randn(5, 3, 3)
names = ["beta[1]","beta[2]","s2"]

push!(names, "chain")
newA = vcat([hcat(A[:,:,i],fill(i,size(A,1))) for i in 1:size(A,3)]...)
df = DataFrame(newA, Symbol[names...])

请注意,如果没有显式调用hcat和vcat,您可以更简洁地执行此操作:

newA = [[[A[:,:,i] fill(i,size(A,1))] for i in 1:size(A,3)]...]