user2988577
user2988577

Reputation: 4197

Combining numpy multi-dimensional arrays

I.m facing a little issue to combine arrays in a certain manner. Let's say we have

a=array([[1,1,1],[2,2,2],[3,3,3]])

b=array([[10,10,10],[20,20,20],[30,30,30]])

I wish to get

c=array([[[1,1,1],[10,10,10]],[[2,2,2],[20,20,20]],[[3,3,3],[30,30,30]]])

The real issue is that my arrays a and b are much longer than 3 coordinates!

The best I achieved using concatenate is:

concatenate((a,b),axis=2)

which results in

array([[ 1, 1, 1, 10, 10, 10], [ 2, 2, 2, 20, 20, 20], [ 3, 3, 3, 30, 30, 30]])

it is pretty good but not have enough depth.

Also, I've tried something from another question to get the desired depth:

d=concatenate((a[...,None],b[...,None]),axis=2)

but results in:

 array([[[ 1, 10],
    [ 1, 10],
    [ 1, 10]],

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

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

Which still does not works...

Upvotes: 6

Views: 7378

Answers (3)

Jeremiah O'Neil
Jeremiah O'Neil

Reputation: 21

You're looking for numpy.stack. It's used for joining arrays along a new axis; in contrast to 'numpy.concatenate', which is for joining arrays along an existing axis. With stack, you specify the axis to join along in terms of which axis it would be after the stacking; so you would specify axis 1.

a = array([[1,1,1],[2,2,2],[3,3,3]])
b = array([[10,10,10],[20,20,20],[30,30,30]])
c = stack((a, b), axis=1)

>>> c
array([[[ 1,  1,  1],
    [10, 10, 10]],

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

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

Upvotes: 2

Bi Rico
Bi Rico

Reputation: 25813

It seems like you want to add a new axis between 0 and 1 so put the None in the middle. This will shift axis 1 be axis 2 and create a new dimension at 1. Like so:

a = array([[1,1,1],[2,2,2],[3,3,3]])
b = array([[10,10,10],[20,20,20],[30,30,30]])
c = concatenate((a[:, None, :], b[:, None, :]), axis=1)

>>> c
array([[[ 1,  1,  1],
    [10, 10, 10]],

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

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

Upvotes: 5

Joran Beasley
Joran Beasley

Reputation: 113930

ummm zip(a,b) ?

is not what you want??

>>> a=array([[1,1,1],[2,2,2],[3,3,3]]);b=array([[10,10,10],[20,20,20],[30,30,30]
>>> zip(a,b)
[(array([1, 1, 1]), array([10, 10, 10])), (array([2, 2, 2]), array([20, 20, 20])), (array([3, 3, 3]), array([30, 30, 30]))]

Upvotes: 6

Related Questions