3

I'm experimenting in ipython3, where I created an array of arrays:

In [105]: counts_array
Out[105]: 
array([array([ 17,  59, 320, ...,   1,   7,   0], dtype=uint32),
       array([ 30,  71, 390, ...,  12,  20,   6], dtype=uint32),
       array([  7, 145, 214, ...,   4,  12,   0], dtype=uint32),
       array([ 23, 346, 381, ...,  15,  19,   5], dtype=uint32),
       array([ 51,  78, 270, ...,   3,   0,   2], dtype=uint32),
       array([212, 149, 511, ...,  19,  31,   8], dtype=uint32)], dtype=object)

In [106]: counts_array.shape
Out[106]: (6,)

In [107]: counts_array[0].shape
Out[107]: (1590,)

I would like to obtain a plain shape=(6, 1590), dtype=uint32 array from this monster I created.

How can I do that?

3 Answers 3

4

You can use np.vstack -

np.vstack(counts_array)

Another way with np.concatenate -

np.concatenate(counts_array).reshape(len(counts_array),-1)

Sample run -

In [23]: a
Out[23]: 
array([array([68, 92, 84, 35, 14, 71, 55, 40, 21, 41]),
       array([30, 90, 52, 64, 86, 68, 61, 85, 26, 98]),
       array([98, 64, 23, 49, 13, 17, 52, 96, 97, 19]),
       array([54, 26, 25, 22, 95, 77, 20, 73, 22, 80]),
       array([15, 84, 91, 54, 25, 21, 37, 19, 25, 25]),
       array([87, 17, 49, 74, 11, 34, 27, 23, 22, 83])], dtype=object)

In [24]: np.vstack(a)
Out[24]: 
array([[68, 92, 84, 35, 14, 71, 55, 40, 21, 41],
       [30, 90, 52, 64, 86, 68, 61, 85, 26, 98],
       [98, 64, 23, 49, 13, 17, 52, 96, 97, 19],
       [54, 26, 25, 22, 95, 77, 20, 73, 22, 80],
       [15, 84, 91, 54, 25, 21, 37, 19, 25, 25],
       [87, 17, 49, 74, 11, 34, 27, 23, 22, 83]])
Sign up to request clarification or add additional context in comments.

4 Comments

Thanks. According to %timeit in ipython, on my data, your concatenate way is twice as fast as my array way. The vstack way is more than 4 .5 times slower.
@bli Awesome ! Good to see some runtime numbers there! Not surprised by those, as vstack would internally use concatenate.
And vstack has to first reshape each array to 2d.
@hpaulj That makes sense then for the timings, thanks!
2

After various experiments, it turns out that the following simple syntax just works:

numpy.array([sub_array for sub_array in counts_array])

My first working version was unnecessary complicated:

numpy.array([[*sub_array] for sub_array in counts_array], dtype=numpy.uint32)

Comments

2

Have you considered numpy.vstack()? I use it very often for this kind of operations.

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.