2014-05-23 47 views
2

我有一個多維數組:朱莉婭最好的方式來重塑多維數組

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" 

請告訴我最好的方式來重塑這個多dim數組,以便我有一個數據幀,如:

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

目前,我認爲最好的方法是將循環和調用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]) 
0

看你的資料,看來你想基本上是由sim1.value[1:5,:,:]相互疊放三個矩陣輸出垂直,加上與基體的索引添加一列。傑出和可敬的約翰邁爾斯懷特接受的答案似乎把每個矩陣的全部內容放入它自己的專欄中。

下面的匹配使用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)]...]