[Numpy-discussion] Stacking a 2d array onto a 3d array

josef.pktd at gmail.com josef.pktd at gmail.com
Tue Oct 26 20:55:59 EDT 2010


On Tue, Oct 26, 2010 at 8:15 PM, Dewald Pieterse
<dewald.pieterse at gmail.com> wrote:
> Starting with:
>
>> In [93]: test =
>> numpy.array([[[1,1,1],[1,1,1]],[[2,2,2],[2,2,2]],[[3,3,3],[3,3,3]]])
>>
>> In [94]: test
>> Out[94]:
>> array([[[1, 1, 1],
>>         [1, 1, 1]],
>>
>>        [[2, 2, 2],
>>         [2, 2, 2]],
>>
>>        [[3, 3, 3],
>>         [3, 3, 3]]])
>>
>> Slicing the complete first row:
>>
>> In [95]: firstrow = test[0,:,:]
>>
>> In [96]: firstrow
>> Out[96]:
>> array([[1, 1, 1],
>>        [1, 1, 1]])
>
> I want to stack firstrow onto test to end up with:
>
>> ([[[1, 1, 1],
>>         [1, 1, 1]],
>>
>>        [[1, 1, 1],
>>         [1, 1, 1]],
>>
>>        [[2, 2, 2],
>>         [2, 2, 2]],
>>
>>        [[3, 3, 3],
>>         [3, 3, 3]]]
>
>
> vstack wants the array dimensions to be the same, is this possible without
> doing 1 dimensional reshape, the actual data I want to do this on is some
> what larger.
>
>>  numpy.vstack((firstrow,test))
>>
>> ---------------------------------------------------------------------------
>> ValueError                                Traceback (most recent call
>> last)
>>
>> /mnt/home/home/bmeagle/M/programme/analiseerverwerkteprent.py in
>> <module>()
>> ----> 1
>>       2
>>       3
>>       4
>>       5
>>
>> /usr/lib64/python2.6/site-packages/numpy/core/shape_base.py in vstack(tup)
>>     212
>>     213     """
>> --> 214     return _nx.concatenate(map(atleast_2d,tup),0)
>>     215
>>     216 def hstack(tup):
>>
>> ValueError: arrays must have same number of dimensions
>
>
> What is the correct python way to do this?

keep the first dimension or add it back in

>>> test = np.array([[[1,1,1],[1,1,1]],[[2,2,2],[2,2,2]],[[3,3,3],[3,3,3]]])
>>> np.vstack((test[:1], test))
array([[[1, 1, 1],
        [1, 1, 1]],

       [[1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3]]])
>>> np.vstack((test[0][None,...], test))
array([[[1, 1, 1],
        [1, 1, 1]],

       [[1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3]]])
>>> np.vstack((test[0][None,:,:], test))
array([[[1, 1, 1],
        [1, 1, 1]],

       [[1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3]]])

I like expand_dims for arbitrary axis, e.g.

>>> ax=1
>>> np.concatenate((np.expand_dims(test[:,0,:],ax), test), ax)
array([[[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [3, 3, 3]]])

Josef


>
>
> --
> Dewald Pieterse
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>



More information about the NumPy-Discussion mailing list