Function axis

From APL Wiki
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.

Function axis ([ax]) is a special syntax which modifies the behavior of a function, for example [2] to Rotate along the second axis. Axis specification was a feature of Iverson notation and was ubiquitous in early APLs; many newer APLs which adhere to leading axis theory reject the use of axis specification in favor of the Rank operator because it is a fully general operator while the behavior of functions with axis must be defined for each function separately. However, GNU APL implements the syntax and extends it so it applies to all user-defined functions.


Monadic functions

The following monads may allow an axis:

  • Mix accepts a list of axes to specify where the axes of argument elements will be placed in the result.
  • Ravel accepts a list of axes which are combined, or a single fractional number to add a length-1 axis.
  • Enclose accepts a list of axes. Each subarray along these axes is enclosed.
  • Split accepts a single axis, and encloses each vector along that axis.
  • Reverse reverses along the specified axis.

Dyadic functions

The following dyads may allow one:

  • Scalar dyadics accept a list of axes to override conformability rules: it specifies , for each axis in the lower-rank (or left, in case of a tie) argument, which axis in the other argument it is paired with.
  • Catenate combines along the selected axis, adding a new axis if a non-integer axis is given.
  • Rotate rotates the right argument along the selected axis.
  • Replicate and Expand work on the specified right argument axis.
  • Take and Drop modify the selected right argument axes.
  • Squad indexing takes axes to specify which axis of the right argument corresponds to each left argument element.
  • Partition and Partitioned Enclose have complicated and different behavior.


The following operators may admit axis specification:

  • Reduction removes the specified right argument axis.
  • Scan works on the specified right argument axis.

In SHARP APL, Replicate and Expand are also included in this category as they are operators and not functions.

Axis specification always modifies the derived function obtained from an operator, and not the operator itself. The exact syntax may vary: in most cases a set of brackets is parsed like a monadic operator and applies directly to the derived function; sometimes brackets can be applied directly to an operator, in which case the derived function produced by this operator is modified. In Dyalog APL, a slash with axis retains its function-operator overloading: it can be applied as an operator or as a dyadic function (Replicate or Expand).


GNU APL generalises function axis to all functions, and beyond cases that refer to one or more argument axes. The axis works like an additional argument, which the function can use in any way. For example, [ax] M computes the QR factorization of M with the comparison tolerance of ax. Here, ax is not an axis at all, and there's no direct connection between this monadic usage of Domino and its non-axis meaning of Matrix inverse. Thus there is no value for ax such that f[ax] is the same as f, which is usually the case for existing axis definitions (not scalar functions). Much like the left argument of Circular (), The GNU APL specific File Input Output system function (⎕FIO) uses the bracket axis syntax as a function selector, as does the SQL interface function (⎕SQL). Some of the options for ⎕SQL take additional parameters as subsequent elements of the array inside the brackets. Similarly, the regular expression interface (⎕RE) uses character "axes" as flags for the regular expression engine, where Dyalog APL uses a dyadic operator, Variant (), for analogous functionality.

GNU APL additionally gives user-defined functions, both dfns and tradfns, access to the bracket axis syntax, again while permitting its use for any purpose. For example, the root function could be implemented as a monadic function with axis specifying the degree, rather than as a dyadic function. In a dfn, the value given via axis notation is denoted χ:

Works in: GNU APL

Or as a tradfn, indicating axis notation in the header line:

 rRoot[ax] y

Works in: GNU APL

External links



APL built-ins [edit]
Primitive functions
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentitySelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndex
Selector Index generatorGradeIndex OfInterval IndexIndicesDeal
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Primitive operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductPowerAtUnderRankDepthVariantStencilCut (J)
Quad names
Arrays Index originMigration levelAtomic vector
Functions Name classCase convertUnicode convert
Operators SearchReplace