6

I have a project in which there is a for loop running about 14 times. In every iteration, a 2D array is created with this shape (4,3). I would like to concatenate those 2D arrays into one 3D array (with the shape of 4,3,14) so that every 2D array would be in different "layer". How should that be implemented in Python?

4 Answers 4

4

You can use numpy.dstack() to turn a list of 2D arrays into a 3D array:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.dstack.html

Sign up to request clarification or add additional context in comments.

6 Comments

I tried this, but it didn't work because in the first iteration I have only one 2D array. In the second iteration, I have two 2D arrays that I wand to concatenate into a 3D array. in the third iteration, I want to concatenate the 3D array with the new 2D array and something goes wrong.
@pyigal: Doing what you're doing would be very slow. Instead, make a list, append each array to it in your loop, then dstack() the entire list at the end. This will be much, much faster, because it avoids copying the data N times.
you mean using this function ndarray.tolist() and then dstack()?
No. Read my previous comment again. Make a list of arrays, then dstack them.
So the final array is a numpy array?
|
1

If your array sizes are static as you mentioned, you can do the following

output_array = numpy.zeros((14,4,3), dtype=np.float32)
for i in range(14):
    mat = numpy.random.rand(4,3)
    output_array[i] = mat

you initialize your final array to the size you want and then loop over and assign your matrix (4,3) to the index of that respective loop counter.

The shape and your final matrix is

numpy.shape(output_array)

returns you

(14, 4, 3)

Output is

array([[[ 0.62507486,  0.3246161 ,  0.43934602],
    [ 0.14476213,  0.76139957,  0.92813474],
    [ 0.26556504,  0.02475475,  0.90740073],
    [ 0.08017973,  0.97526789,  0.2213122 ]],

   [[ 0.70042586,  0.8122381 ,  0.79289031],
    [ 0.0369414 ,  0.10780825,  0.77501732],
    [ 0.10386232,  0.86237574,  0.5829311 ],
    [ 0.1888348 ,  0.85105735,  0.31599012]],

   [[ 0.26350111,  0.8787083 ,  0.12869285],
    [ 0.25927794,  0.25701383,  0.81212741],
    [ 0.06661031,  0.53449911,  0.50212061],
    [ 0.40009728,  0.78002244,  0.81524432]],

   [[ 0.49921468,  0.82028496,  0.51261139],
    [ 0.62790054,  0.64566481,  0.02624587],
    [ 0.39364958,  0.99537313,  0.33225098],
    [ 0.88214922,  0.20252077,  0.78350848]],

   [[ 0.29032609,  0.95975012,  0.06733917],
    [ 0.24497923,  0.51818371,  0.93520784],
    [ 0.80267638,  0.88271469,  0.30779642],
    [ 0.57030594,  0.34175804,  0.52563131]],

   [[ 0.61039209,  0.57186425,  0.76554799],
    [ 0.55681604,  0.33107477,  0.05680386],
    [ 0.15465826,  0.13452645,  0.09498007],
    [ 0.29682869,  0.93196124,  0.94435322]],

   [[ 0.23904459,  0.94893754,  0.97033942],
    [ 0.89159942,  0.85306913,  0.02144577],
    [ 0.57696968,  0.82578647,  0.33358794],
    [ 0.81979036,  0.73351973,  0.027876  ]],

   [[ 0.6568135 ,  0.25458351,  0.10369358],
    [ 0.06151289,  0.00939822,  0.00798484],
    [ 0.92518032,  0.19057493,  0.84838325],
    [ 0.78189474,  0.15273546,  0.34607282]],

   [[ 0.46961641,  0.19778872,  0.1498462 ],
    [ 0.55704814,  0.96889585,  0.08894933],
    [ 0.48003736,  0.59383452,  0.42212519],
    [ 0.78752649,  0.07204869,  0.4215464 ]],

   [[ 0.6454156 ,  0.84189773,  0.10041234],
    [ 0.89345407,  0.60821944,  0.56667495],
    [ 0.62806529,  0.67642623,  0.4951494 ],
    [ 0.85371262,  0.13159418,  0.3402876 ]],

   [[ 0.39828625,  0.50659049,  0.34835485],
    [ 0.06839356,  0.74652916,  0.5722388 ],
    [ 0.20762053,  0.0692997 ,  0.02790474],
    [ 0.84786427,  0.98461425,  0.19105092]],

   [[ 0.36976317,  0.44268745,  0.23061621],
    [ 0.47827819,  0.43044546,  0.90150601],
    [ 0.2307732 ,  0.61590552,  0.82066673],
    [ 0.49611789,  0.4480612 ,  0.46685895]],

   [[ 0.40907925,  0.15996945,  0.05480348],
    [ 0.70230347,  0.00926704,  0.97775948],
    [ 0.19834276,  0.20127937,  0.44351548],
    [ 0.48512974,  0.07319999,  0.5580616 ]],

   [[ 0.35749629,  0.88443983,  0.55465496],
    [ 0.61600298,  0.08260803,  0.4010818 ],
    [ 0.40910226,  0.31984288,  0.50188118],
    [ 0.34836289,  0.14394118,  0.06841569]]], dtype=float32)

Hope that helps

2 Comments

Thank you. I think I'll use this option
Your welcome. Maybe you can accept this as the correct answer and make your thanks more explicit ;)
0

Adding layers to 2D array works as suggested by @JohnZwinck in comments.

#data_in is the original data with the shape(14,n,m) #The loop involves taking one level at a time (and applying applicable functions) and then storing the resulting 2D array into a list:

Here is the solution that worked:

new_list = []
for i in range(0,14): #looping 14 times (or equivalent to size of dimension considered)
    print (i)
    print (data_in[i,:,:].shape) #Choosing a level makes it a 2D array 

#(so, the shape at this stage will be (n,m))
    new_list.append(data_in)
 
final_list = np.dstack(new_list)


#In case the final dimension gets added as the last dimension, do this:
a = np.empty((14,n,m))
final_list = np.transpose(a, (0,1,2))

print (final_list.shape)

Comments

-2

If your arrays are only 'list', sumplt defines an empty list at the beginning and append item into it: foo=[] for i in range(14): ... foo.append(tab)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.