2014-05-23 3 views
2

J'ai un tableau multidimensionnel:Julia meilleure façon de remodeler tableau multi-dim

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 

J'ai des noms pour la 2ème dimension dans

julia> sim1.names 
3-element Array{String,1}: 
"beta[1]" 
"beta[2]" 
"s2" 

Quel est le meilleur moyen de remodeler ce multi dim ensemble pour que j'ai une trame de données comme:

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 
...  | ...  | ...  | ... 

Répondre

2

à l'heure actuelle, je pense que la meilleure façon de le faire serait un mélange de boucles et appelle à 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

regardant vos données, il semble que vous vouliez empiler essentiellement la sortie de trois matrices par sim1.value[1:5,:,:] au-dessus de l'autre verticalement, plus ajouter une colonne à l'index de la matrice. La réponse acceptée du brillant et vénérable John Myles White semble mettre le contenu entier de chacune de ces matrices dans sa propre colonne.

Le code ci-dessous correspond à la sortie souhaitée en utilisant vcat pour l'empilage et hcat et fill pour ajouter la colonne supplémentaire. JMW Je suis sûr, savoir s'il y a une meilleure façon :)

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...]) 

Notez également que vous pouvez faire un peu plus de façon concise, sans les appels explicites à HCAT et VCAT:

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