Hi,
Not sure if this has been answered already.
My question is similar to this topic: Very best way to concatenate an array of arrays
Basically, I want a more general solution. That is, if I have a multidimensional array, I want to convert it into a nested array, and vice versa.
For example, in Python, one could do this:
import numpy as np
x = np.random.randn(3, 2, 4)
x_list = x.tolist()
x == np.array(x_list) # True
How would I translate this to Julia? Or is there something similar? I essentially want:
x = randn(3, 2, 4)
x_list = tolist(x) # `tolist` is a function I'm looking for
x == toarray(x_list) # `toarray` is another function I'm looking for
I’d also be interested in generalizing this to higher-order arrays.
Thanks!
EDIT (Feb 8, 2020):
Thanks for the responses so far! I apologize as my original question was unclear. I’ve added the following snippet to clarify my intent.
I’m aware of libraries like BSON.jl
and JLD(2).jl
. But I am sometimes interested in saving multidimensional arrays (like x
, a 3D array, in my example below) in JSON format for compatibility with other software. The issue is when I “json-ify” multidimensional arrays, (jx
below), and then try to parse it, I don’t get back a multidimensional array, but an Array{Any, 1}
, which in this case is really a nested array (specifically, array of array of arrays, px
below).
I can come up with a hack to convert this back to the original format (x_again
), but I am curious if there is a cleaner way to do this. It would also be nice if there’s a solution which generalizes to higher order arrays.
Hope this makes sense.
Thanks!
using JSON
# Generate an Array of dimensions (2, 3, 4)
x = reshape(collect(1:24), 2, 3, 4)
# 2Ă—3Ă—4 Array{Int64,3}:
# [:, :, 1] =
# 1 3 5
# 2 4 6
#
# [:, :, 2] =
# 7 9 11
# 8 10 12
#
# [:, :, 3] =
# 13 15 17
# 14 16 18
#
# [:, :, 4] =
# 19 21 23
# 20 22 24
# Convert to JSON
jx = JSON.json(x)
# "[[[1,2],[3,4],[5,6]],[[7,8],[9,10],[11,12]],[[13,14],[15,16],[17,18]],[[19,20],[21,22],[23,24]]]"
# Parse JSON
px = JSON.parse(jx)
# 4-element Array{Any,1}:
# Any[Any[1, 2], Any[3, 4], Any[5, 6]]
# Any[Any[7, 8], Any[9, 10], Any[11, 12]]
# Any[Any[13, 14], Any[15, 16], Any[17, 18]]
# Any[Any[19, 20], Any[21, 22], Any[23, 24]]
# Convert parsed JSON back to original array, x
x_again = [px[i][j][k]
for k in 1:length(px[1][1]),
j in 1:length(px[1]),
i in 1:length(px)]
# 2Ă—3Ă—4 Array{Int64,3}:
# [:, :, 1] =
# 1 3 5
# 2 4 6
#
# [:, :, 2] =
# 7 9 11
# 8 10 12
#
# [:, :, 3] =
# 13 15 17
# 14 16 18
#
# [:, :, 4] =
# 19 21 23
# 20 22 24
# Assert all elements are the same
@assert all(x .== x_again) # true