# Reverse

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Template:Primitive is a monadic function which reorders elements of the argument to go in the opposite direction along a specified axis. The name Reverse is typically used for the primitive `⌽`, which reverses along the last axis, while `⊖`, which reverses along the first axis, is called "Reverse First", "Reverse-down", or similar. In APLs with function axis, either for may use a specified axis which overrides this default choice of axis. In the leading axis model, specifying an axis is discouraged in favor of using `⊖` with the Rank operator.

## Examples

Reverse flips a matrix horizontally, changing elements to go right to left, and Reverse First flip vertically, so the elements are reordered top to bottom.

```      x ← 10 20 30 ∘.+ ⍳6
x
11 12 13 14 15 16
21 22 23 24 25 26
31 32 33 34 35 36
⌽x
16 15 14 13 12 11
26 25 24 23 22 21
36 35 34 33 32 31
⊖x
31 32 33 34 35 36
21 22 23 24 25 26
11 12 13 14 15 16
```

Since a vector only has one axis, any form of Reverse will reverse along this axis.

```      ⌽ 'Backwards text'
txet sdrawkcaB
⊖⌽ 'Backwards text'       ⍝ One reverse undoes the other
Backwards text
```

Reverse with a specified axis can reverse along any of the three dimensions of the array below.

```      ⊢a←2 3 6⍴⍳36
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 27 28 29 30
31 32 33 34 35 36
(⌽[1]a)(⌽[2]a)(⌽[3]a)
┌─────────────────┬─────────────────┬─────────────────┐
│19 20 21 22 23 24│13 14 15 16 17 18│ 6  5  4  3  2  1│
│25 26 27 28 29 30│ 7  8  9 10 11 12│12 11 10  9  8  7│
│31 32 33 34 35 36│ 1  2  3  4  5  6│18 17 16 15 14 13│
│                 │                 │                 │
│ 1  2  3  4  5  6│31 32 33 34 35 36│24 23 22 21 20 19│
│ 7  8  9 10 11 12│25 26 27 28 29 30│30 29 28 27 26 25│
│13 14 15 16 17 18│19 20 21 22 23 24│36 35 34 33 32 31│
└─────────────────┴─────────────────┴─────────────────┘
```

The Rank operator can also be used to reverse along a particular axis. While Rank has no effect on Reverse (last), Reverse First with rank `k` reverses the first axis of each `k`-cell, or the `1+r-k`'th axis of a rank-`r` array.

```      ⌽⍤2⊢a                     ⍝ Same as ⌽
5  4  3  2  1  0
11 10  9  8  7  6
17 16 15 14 13 12

23 22 21 20 19 18
29 28 27 26 25 24
35 34 33 32 31 30
⊖⍤2⊢a                    ⍝ Same as ⌽[2]
12 13 14 15 16 17
6  7  8  9 10 11
0  1  2  3  4  5

30 31 32 33 34 35
24 25 26 27 28 29
18 19 20 21 22 23
(⊖⍤3⊢a)(⊖⍤2⊢a)(⊖⍤1⊢a)
┌─────────────────┬─────────────────┬─────────────────┐
│19 20 21 22 23 24│13 14 15 16 17 18│ 6  5  4  3  2  1│
│25 26 27 28 29 30│ 7  8  9 10 11 12│12 11 10  9  8  7│
│31 32 33 34 35 36│ 1  2  3  4  5  6│18 17 16 15 14 13│
│                 │                 │                 │
│ 1  2  3  4  5  6│31 32 33 34 35 36│24 23 22 21 20 19│
│ 7  8  9 10 11 12│25 26 27 28 29 30│30 29 28 27 26 25│
│13 14 15 16 17 18│19 20 21 22 23 24│36 35 34 33 32 31│
└─────────────────┴─────────────────┴─────────────────┘
```

Reversing a scalar has no effect: there are no axes to reverse along.

```      ⌽1.1
1.1
```