How to slice range of array along a (a-priori unknown) axis?

Peter Otten __peter__ at web.de
Thu Feb 5 11:58:15 CET 2004


Maarten van Reeuwijk wrote:

> I am using the Numeric package, and I need to strip edge cells off an
> array (dimension unknown) in an a-priori unknown direction. I implented
> this as follows:
> 
> def el_remove_bcells(var, axis):
>    """ elementary routine to strip the edge cells of an array for the
>    given
>        direction.
>    """
> 
>    if axis == 0:
>       return var[1:-1]
>    if axis == 1:
>       return var[:, 1:-1]
>    else:
>       return var[:, :,1:-1]
> 
> But this only works for at most 3D arrays. It must be possible to program
> this fragment without the ifs, for arrays of arbitrary dimension. Is there
> a command in the Numerical package I can use for this? It is very
> important that this method is very fast, as my arrays normally are in the
> order of 100 Mb.

Maybe:

>>> def clipdim(a, n):
...     t = [slice(None)] * N.rank(a)
...     t[n] = slice(1,-1)
...     return a[t]
...
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],
       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],
       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])
>>> clipdim(a, 0)
array([       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])
>>> clipdim(a, 1)
array([[        [ 3,  4,  5]],
       [        [12, 13, 14]],
       [        [21, 22, 23]]])
>>> clipdim(a, 2)
array([[[ 1],
        [ 4],
        [ 7]],
       [[10],
        [13],
        [16]],
       [[19],
        [22],
        [25]]])

Peter



More information about the Python-list mailing list