[Numpy-discussion] Re: Method to shift elements in an array?
Alan G Isaac
aisaac at american.edu
Fri Feb 24 21:44:02 EST 2006
Tim wrote:
> import numpy
> def roll(A, n):
> "Roll the array A in place. Positive n -> roll right, negative n ->
> roll left"
> if n > 0:
> n = abs(n)
> temp = A[-n:]
> A[n:] = A[:-n]
> A[:n] = temp
> elif n < 0:
> n = abs(n)
> temp = A[:n]
> A[:-n] = A[n:]
> A[-n:] = temp
> else:
> pass
This probably counts as a gotcha:
>>> a=N.arange(10)
>>> temp=a[-6:]
>>> a[6:]=a[:-6]
>>> a[:6]=temp
>>> a
array([4, 5, 0, 1, 2, 3, 0, 1, 2, 3])
Cheers,
Alan Isaac
PS Here's something close to the rotater functionality.
#rotater: rotate row elements
# Format: y = rotater(x,r,copydata)
# Input: x RxC array
# rotateby size R integer array, or integer (rotation amounts)
# inplace boolean (default is False -> copies data)
# Output: y RxC array:
# rows rotated by rotateby
# or None (if inplace=True)
# Remarks: Intended for use with 2D arrays.
# rotateby values are positive for rightward rotation,
# negative for leftward rotation
# :author: Alan G Isaac (aisaac AT american DOT edu)
# :date: 24 Feb 2006
def rotater(x,rotateby,inplace=False) :
assert(len(x.shape)==2), "For 2-d arrays only."
xrotate = numpy.array(x,copy=(not inplace))
xrows = xrotate.shape[0]
#make an iterater of row shifts
if isinstance(rotateby,int):
from itertools import repeat
rowshifts = repeat(rotateby,xrows)
else:
rowshifts = numpy.asarray(rotateby)
assert(rowshifts.size==xrows)
rowshifts = rowshifts.flat
#perform rotation on each row
for row in xrange(xrows):
rs=rowshifts.next()
#do nothing if rs==0
if rs>0:
xrotate[row] = numpy.concatenate([xrotate[row][-rs:],xrotate[row][:-rs]])
elif rs<0:
xrotate[row] = numpy.concatenate([xrotate[row][:-rs],xrotate[row][-rs:]])
if inplace:
return None
else:
return xrotate
More information about the NumPy-Discussion
mailing list