I would like to transform a multidimensional array into a matrix of indexes and with the last column being the value itself. In a similar fashion to what `pivot_longer`

does in R.

As an example, this 3-D array:

```
rand(2,2,2)
2×2×2 Array{Float64, 3}:
[:, :, 1] =
0.815842 0.251812
0.328409 0.474825
[:, :, 2] =
0.315777 0.707802
0.427597 0.308795
```

will become:

```
3×4 Matrix{Float64}:
1.0 1.0 1.0 0.815842
1.0 1.0 2.0 0.315777
1.0 2.0 1.0 0.251812
...
```

One strategy may be to use list comprehension in the array itself, but is there a more straightforward way?

I’m sure there are more elegant solutions, but here is one that works:

using Random

Random.seed!(5411)

```
function pivot_longer(x)
output = zeros(length(x), length(size(x))+1)
for (i,idx) in enumerate(CartesianIndices(x))
output[i,:] = [idx.I... x[idx]]
end
return output
end
x = rand(2, 2, 2)
y = pivot_longer(x)
```

**output**

```
julia> x
2×2×2 Array{Float64, 3}:
[:, :, 1] =
0.93722 0.283684
0.988042 0.183431
[:, :, 2] =
0.970431 0.842597
0.473857 0.121432
```

```
julia> y
8×4 Matrix{Float64}:
1.0 1.0 1.0 0.93722
2.0 1.0 1.0 0.988042
1.0 2.0 1.0 0.283684
2.0 2.0 1.0 0.183431
1.0 1.0 2.0 0.970431
2.0 1.0 2.0 0.473857
1.0 2.0 2.0 0.842597
2.0 2.0 2.0 0.121432
```

2 Likes

`pivot_longer`

in R is for datasets, `InMemoryDatasets`

package’s `transpose`

does that.