Bracket indexing

From APL Wiki
Jump to navigation Jump to search
[]

Bracket indexing ([]), or simply Indexing, is a special primitive function which uses the postfix 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]
B
      'ABCDE'[2 31 2 3 4 5 1]
ABC
DEA

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.

      A2 3 410×⍳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[1;1;1]
10
 
      A[2;3 2;4 1]
240 210
200 170

      A[;2;]
 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.

      M
10 20 30 40
50 60 70 80
 
      M[1 2]
20
 
      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
ZZZ

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)
      G2 3G,('MNO' 5)('PQR' 6)
      G
┌───────┬───────┬───────┐
│┌───┬─┐│┌───┬─┐│┌───┬─┐│
││ABC1│││DEF2│││GHI3││
│└───┴─┘│└───┴─┘│└───┴─┘│
├───────┼───────┼───────┤
│┌───┬─┐│┌───┬─┐│┌───┬─┐│
││JKL4│││MNO5│││PQR6││
│└───┴─┘│└───┴─┘│└───┴─┘│
└───────┴───────┴───────┘
 
      G[((1 2)1)((2 3)2)]
┌───┬─┐
DEF6
└───┴─┘
 
      G[2 2⍴⊂(2 2)2]
5 5
5 5
      G[⊂⊂1 1]
┌───────┐
│┌───┬─┐│
││ABC1││
│└───┴─┘│
└───────┘

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.

External links

Documentation


APL built-ins [edit]
Primitive functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentitySelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndex
Selector Index generatorGradeIndex OfInterval IndexIndicesDeal
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialise
Primitive operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-beamSpawnFunction axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Atop, Over) ∙ Inner ProductPowerAtUnderRankDepthVariantStencil
Quad names
Arrays Index originMigration level
Functions Case convert
Operators SearchReplace