P: n/a

Hello,
I am using the Numeric package, and I need to strip edge cells off an array
(dimension unknown) in an apriori 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  
Share this Question
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  
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  
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 apriori 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   This discussion thread is closed Replies have been disabled for this discussion.   Question stats  viewed: 1588
 replies: 3
 date asked: Jul 18 '05
