By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,036 Members | 1,963 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,036 IT Pros & Developers. It's quick & easy.

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

P: n/a
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

--
================================================== =================
Maarten van Reeuwijk Thermal and Fluids Sciences
Phd student dept. of Multiscale Physics
www.ws.tn.tudelft.nl Delft University of Technology
Jul 18 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
This should work.

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

--
Regards,

Diez B. Roggisch
Jul 18 '05 #2

P: n/a
> 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)

--
================================================== =================
Maarten van Reeuwijk Thermal and Fluids Sciences
Phd student dept. of Multiscale Physics
www.ws.tn.tudelft.nl Delft University of Technology
Jul 18 '05 #3

P: n/a
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
Jul 18 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.