Reverse

From APL Wiki
Revision as of 15:03, 1 November 2019 by Miraheze>Marshall (→‎External links)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

Description

In languages with function axis, exactly one argument axis may be specified.

Reversing a scalar always yields that scalar unchanged. Otherwise, Reverse operates on a particular axis of its argument. This axis is the specified axis if one is given, and otherwise the last axis for , or the first axis for .

The result array has the same shape and elements as the argument array, but the elements go in the opposite direction along the reversal axis: the first in the argument is last in the result, and so on. Consequently if the length of this axis is 0 or 1 then reversing has no effect.

APL model

The reverse of a vector x may be written in any APL, assuming ⎕IO←0, as x[(¯1+⍴x)-⍳⍴x]. To reverse an arbitrary array Squad indexing with axis (or rank) is helpful.

ReverseAxis ← {
    ⎕IO←0
    0=≢⍴⍵: ⍵                    ⍝ Return a scalar unchanged
    ⍺ ← ¯1+≢⍴⍵                  ⍝ Assume last axis
    l ← ⍺ ⌷ ⍴⍵                  ⍝ Length of reversed axis
    (l-1+⍳l) ⌷[⍺] ⍵             ⍝ Reverse with indexing
}

External links

Lessons

Documentation


APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)
Quad names Index originComparison toleranceMigration levelAtomic vector