[Numpy-discussion] Interleaved Arrays and

Neil Martinsen-Burrell nmb@wartburg....
Tue Jun 16 15:14:35 CDT 2009


On 06/16/2009 02:18 PM, Robert wrote:
>   >>>  n = 10
>   >>>  xx = np.ones(n)
>   >>>  yy = np.arange(n)
>   >>>  aa = np.column_stack((xx,yy))
>   >>>  bb = np.column_stack((xx+1,yy))
>   >>>  aa
> array([[ 1.,  0.],
>          [ 1.,  1.],
>          [ 1.,  2.],
>          [ 1.,  3.],
>          [ 1.,  4.],
>          [ 1.,  5.],
>          [ 1.,  6.],
>          [ 1.,  7.],
>          [ 1.,  8.],
>          [ 1.,  9.]])
>   >>>  bb
> array([[ 2.,  0.],
>          [ 2.,  1.],
>          [ 2.,  2.],
>          [ 2.,  3.],
>          [ 2.,  4.],
>          [ 2.,  5.],
>          [ 2.,  6.],
>          [ 2.,  7.],
>          [ 2.,  8.],
>          [ 2.,  9.]])
>   >>>  np.column_stack((aa,bb))
> array([[ 1.,  0.,  2.,  0.],
>          [ 1.,  1.,  2.,  1.],
>          [ 1.,  2.,  2.,  2.],
>          [ 1.,  3.,  2.,  3.],
>          [ 1.,  4.,  2.,  4.],
>          [ 1.,  5.,  2.,  5.],
>          [ 1.,  6.,  2.,  6.],
>          [ 1.,  7.,  2.,  7.],
>          [ 1.,  8.,  2.,  8.],
>          [ 1.,  9.,  2.,  9.]])
>   >>>  cc = _
>   >>>  cc.reshape((n*2,2))
> array([[ 1.,  0.],
>          [ 2.,  0.],
>          [ 1.,  1.],
>          [ 2.,  1.],
>          [ 1.,  2.],
>          [ 2.,  2.],
>          [ 1.,  3.],
>          [ 2.,  3.],
>          [ 1.,  4.],
>          [ 2.,  4.],
>          [ 1.,  5.],
>          [ 2.,  5.],
>          [ 1.,  6.],
>          [ 2.,  6.],
>          [ 1.,  7.],
>          [ 2.,  7.],
>          [ 1.,  8.],
>          [ 2.,  8.],
>          [ 1.,  9.],
>          [ 2.,  9.]])
>   >>>
>
>
> However I feel too, there is a intuitive abbrev function like
> 'interleave' or so missing in numpy shape_base or so.

Using fancy indexing, you can set strided portions of an array equal to 
another array.  So::

In [2]: aa = np.empty((10,2))

In [3]: aa[:, 0] = 1

In [4]: aa[:,1] = np.arange(10)

In [5]: bb = np.empty((10,2))

In [6]: bb[:,0] = 2

In [7]: bb[:,1] = aa[:,1] # this works

In [8]: cc = np.empty((20,2))

In [9]: cc[::2,:] = aa

In [10]: cc[1::2,:] = bb

In [11]: cc
Out[11]:
array([[ 1.,  0.],
        [ 2.,  0.],
        [ 1.,  1.],
        [ 2.,  1.],
        [ 1.,  2.],
        [ 2.,  2.],
        [ 1.,  3.],
        [ 2.,  3.],
        [ 1.,  4.],
        [ 2.,  4.],
        [ 1.,  5.],
        [ 2.,  5.],
        [ 1.,  6.],
        [ 2.,  6.],
        [ 1.,  7.],
        [ 2.,  7.],
        [ 1.,  8.],
        [ 2.,  8.],
        [ 1.,  9.],
        [ 2.,  9.]])

Using this syntax, interleave could be a one-liner.

-Neil


More information about the Numpy-discussion mailing list