Bracket indexing

From APL Wiki
Revision as of 22:28, 10 September 2022 by Adám Brudzewsky (talk | contribs) (Text replacement - "</source>" to "</syntaxhighlight>")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Bracket indexing ([]), or simply Indexing, is a special primitive function which uses the postcircumfix notation X[Y] instead of a normal prefix function. The result of X[Y] is an array formed with items of X extracted by the index specification Y.

Indexing modes

Simple indexing

Most APL implementations support only this mode of indexing. In its simplest form, X[Y] on vector X and scalar Y extracts the item of X at index Y. In general, Y can be an array of any shape, with each item being a valid index in X; then X[Y] is a Y-shaped array which contains the indexed results.

      'ABCDE'[2 3⍴1 2 3 4 5 1]

For higher-rank array X with rank n, the notation X[Y1;Y2;...;Yn] selects the indexes of X over each axis. If some Yk is omitted, it implies all indices of k-th axis is selected, which is equivalent to specifying ⍳(⍴X)[k]. The resulting shape is the concatenation of shapes of Y1, Y2, ..., Yn.

      ⎕←A←2 3 4⍴10×⍳24
 10  20  30  40
 50  60  70  80
 90 100 110 120
130 140 150 160
170 180 190 200
210 220 230 240
      A[2;3 2;4 1]
240 210
200 170

 50  60  70  80
170 180 190 200

The major limitation of this indexing mode is that it only supports rectangular selection. For example, it is not possible to form X[1;1],X[2;2] from a matrix X by single indexing.

Choose indexing

In this mode, the index specification Y is a depth-2 nested array. Each item of Y is a vector whose length is the rank of X, and the result is a collection of items of X selected by each item of Y.

10 20 30 40
50 60 70 80
      M[⊂1 2]
      M[2 2⍴⊂2 4]
80 80
80 80
      M[(2 1)(1 2)]
50 20

      'Z'[3⍴⊂⍬]  ⍝ Scalar X can be indexed using enclosed empty vector

Reach indexing

In this mode, Y is a depth-3 nested array. Each item of Y is a vector of nested vectors which specify the index at each level of nesting (which is equivalent to the indexing by Pick). This allows to extract multiple items from a deeply nested array with a single indexing operation.

      G←('ABC' 1)('DEF' 2)('GHI' 3)('JKL' 4)
      G←2 3⍴G,('MNO' 5)('PQR' 6)
      G[((1 2)1)((2 3)2)]
      G[2 2⍴⊂(2 2)2]
5 5
5 5
      G[⊂⊂1 1]

Implementation support

Dyalog APL and NARS2000 support all three modes of indexing. NARS2000 even supports mixing Choose and Reach indexing modes. J does not have this notation at all.

See also

External links


APL built-ins [edit]
Primitives (Timeline) Functions
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
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