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

  • Thread starter Maarten van Reeuwijk
  • Start date
M

Maarten van Reeuwijk

Hello,

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.

TIA, Maarten
 
D

Diez B. Roggisch

This should work.

def el_remove_bcells(var, axis):
if axis == 0:
     return var[1:-1]
else:
return eval("var[%s1:-1]" % ":," * axis)
 
M

Maarten van Reeuwijk

def el_remove_bcells(var, axis):
if axis == 0:
return var[1:-1]
else:
return eval("var[%s1:-1]" % ":," * axis)

Thanks, that does the trick! I love the fact that you can create commands at
runtime :). I also found a command called swapaxes, which is very fast, so
just in case you're interested, here's another way:

def el_remove_bcells(var, axis):
swap = swapaxes(var, 0, axis)
swap = swap[1:-1]
return swapaxes(swap, 0, axis)
 
P

Peter Otten

Maarten said:
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:
.... t = [slice(None)] * N.rank(a)
.... t[n] = slice(1,-1)
.... return a[t]
....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]]])array([ [[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]]])array([[ [ 3, 4, 5]],
[ [12, 13, 14]],
[ [21, 22, 23]]])array([[[ 1],
[ 4],
[ 7]],
[[10],
[13],
[16]],
[[19],
[22],
[25]]])

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top