# What is the best way to perform an anti-transpose in python?

## Question:

Lets say I have an array

``````a = np.arange(16).reshape((4,4))

0   1  2   3
4   5  6   7
8   9  10  11
12  13 14  15
``````

But I want

``````15  11  7  3
14  10  6  2
13  9   5  1
12  8   4  0
``````

which is a flip across the secondary diagonal, or a kind of anti-transpose.

How can I do this in numpy?

One could do one of the following:

`rot90(a,2).T`

`rot90(flipud(a),1)`

`rot90(fliplr(a), -1)`

or as hpaulj suggested in the comments (thanks hpaulj)

`a[::-1,::-1].T`

Here are the speed rankings as ratios of the slowest method after anti-transposing 1000 random 10000×10000 arrays.

1. 63.5% – `a[::-1,::-1].T`
2. 85.6% – `rot90(a,2).T`
3. 97.8% – `rot90(flipud(a),1)`
4. 100% –`rot90(fliplr(a),-1)`

Here’s another to throw into the mix.

``````a.ravel('F')[::-1].reshape(a.shape)
``````

Try it in this manner,

``````np=np[::-1] #reverse the array
a = np.arange(16).reshape((4,4))
``````

`np.flip(a).T`

From the `np.flip` documentation & @hpaulj ‘s comment:

`flip(m) corresponds to m[::-1,::-1,...,::-1] with ::-1 at all positions.`

Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.