Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reverse an arbitrary dimension in an ndarray

I'm working with an n-dimensional array, and I'd like a way to reverse a numbered dimension. So rather than

rev = a[:,:,::-1]

I'd like to be able to write

rev = a.reverse(dimension=2)

or something similar. I can't seem to find examples that don't rely on the former syntax.

like image 441
Shep Avatar asked Nov 05 '12 20:11

Shep


2 Answers

If you browse the numpy (python) source code you'll find a trick they use to write functions that operate on a particular axis is to use np.swapaxes to put the target axis in the axis = 0 position. Then they write code that operates on the 0-axis, and then they use np.swapaxes again to put the 0-axis back in its original position.

You can do that here like so:

import numpy as np
def rev(a, axis = -1):
    a = np.asarray(a).swapaxes(axis, 0)
    a = a[::-1,...]
    a = a.swapaxes(0, axis)
    return a

a = np.arange(24).reshape(2,3,4)

print(rev(a, axis = 2))

yields

[[[ 3  2  1  0]
  [ 7  6  5  4]
  [11 10  9  8]]

 [[15 14 13 12]
  [19 18 17 16]
  [23 22 21 20]]]
like image 99
unutbu Avatar answered Oct 17 '22 09:10

unutbu


For anyone coming across this in the future:

Numpy 1.12+ has the function np.flip(array, dimension), which does exactly as requested. Even better, it returns a view of the data rather than a copy, and so it happens in constant time.

like image 35
Chris L. Barnes Avatar answered Oct 17 '22 08:10

Chris L. Barnes