JPhrases/Indexing
3A. Indexing
{ encompasses everything performed by bracket indexing in other languages. The ranks are 0 _ , that is, x{y can be considered individually for each scalar in x and for y in toto, with the overall result constructed from the individual results in the same way as for all other functions. For scalar x then:
>x is a scalar or a list, and r=:>j{,>x are the indices for axis j . r may be integers in the range i.&.(+&n)n=:j{$y , which selects cells n|r , or r may be boxed integers in that range, in which case the selected cells are all except those in n|r . Thus:
z=: 0{y=: 3 3 3$'ABCDEFGHIJKLMNOPQRSTUVWXYZ]' ibbb=: <ibb=: <ib=: <i=: 1 _1 jbbb=: <jbb=: <jb=: <j=: 2 1 ijbbb=: <ijbb=: <ijb=: <ij=: 2 2$i,j (] ; i&{ ; ib&{ ; ibb&{ ; ibbb&{) z +---+---+-+---+---+ |ABC|DEF|F|DEF|ABC| |DEF|GHI| |GHI| | |GHI| | | | | +---+---+-+---+---+ ijb{y |rank error | ijb {y (] ; i&{ ; ijbb&{ ; ijbbb&{) z +---+---+---+---+ |ABC|DEF|DEF|ABC| |DEF|GHI|GHI| | |GHI| | | | | | |GHI| | | | |DEF| | +---+---+---+---+
The amend adverb } applied to an index produces a function that replaces the selected part of the right argument by the left argument. For example:
'*' ib} z ABC DE* GHI ('def',:'ghi') i} z ABC def ghi (] ; i&{ ; ib&{ ; ibb&{ ; ibbb&{)"2 y +---+---+-+---+---+ |ABC|DEF|F|DEF|ABC| |DEF|GHI| |GHI| | |GHI| | | | | +---+---+-+---+---+ |JKL|MNO|O|MNO|JKL| |MNO|PQR| |PQR| | |PQR| | | | | +---+---+-+---+---+ |STU|VWX|X|VWX|STU| |VWX|YZ]| |YZ]| | |YZ]| | | | | +---+---+-+---+---+ $(<<'') { z 0 3 $(<a:) { z 0 3
Indexing on higher-rank arrays may be illustrated by the argument y :
]k=: <1 2;a:;0 2 +------------+ |+---+--+---+| ||1 2|++|0 2|| || |||| || || |++| || |+---+--+---+| +------------+ y ; k{y +---+--+ |ABC|JL| |DEF|MO| |GHI|PR| | | | |JKL|SU| |MNO|VX| |PQR|Y]| | | | |STU| | |VWX| | |YZ]| | +---+--+
The following examples further illustrate the use of the indexing function. For each example, it may be instructive to plug the values into the expression r=:>j{,>x and work out the result.
n0=: y=: i.4 5 6 7 Array used in examples n1=: (<,<3){y Item 3 of y n2=: (<,3){y Item 3 of y n3=: (<3){y Item 3 of y n4=: 3{y Item 3 of y n5=: (<,<_1){y The last item of y (item _1 of y) n6=: (<,_1){y The last item of y (shape 5 6 7) n7=: (<_1){y The last item of y n8=: _1{y The last item of y n9=: (_1+#y){y The last item of y n10=: 0{y The first item of y n11=: (-#y){y The first item of y n12=: 3 0 _2 0{y Items 3 0 _2 0 of y n13=: i=: ?2 3$0{$y Indices used in examples n14=: j=: ? 1{$y Indices used in examples n15=: k=: ?7 $2{$y Indices used in examples n16=: (<i;j;k){y y[i;j;k;]in APL notation n17=: (<1;2;3){y y[1;2;3;] n18=: (<1,2,3){y y[1;2;3;] n19=: (<1 2 3){y y[1;2;3;] n20=: (<<i){y y[i;;;;] n21=: (<<,i){y y[,i;;...;] n22=: (,i){y y[,i;;...;] n23=: (<<1 3 2){y Items 1 3 2 n24=: (<<<1 3 2){y All but items 1 3 2 n25=: (<<<1 3){y All but items 1 3 n26=: (<<<1){y All but items 1 n27=: (<<<$0){y All but items ... none; i.e. all items n28=: (<<a:){y All items n29=: (<1 3 2;3){y y[1 3 2;3;;...;]in APL (0-origin) n30=: (<(<1 3 2);3){y y[(i.#y)-.1 3 2;3;;...;] n31=: (<(<1 3);3){y y[(i.#y)-.1 3;3;;...;] n32=: (<(<1);3){y y[(i.#y)-.1;3;;...;] n33=: (<(<$0);3){y y[(i.#y)-.$0;3;;...;] n34=: (<(<$0);3){y y[;3;;...;] n35=: (<a:;3){y y[;3;;...;] n36=: 4{"_1 y y[;4;;...;] n37=: (<a:;a:;5){y y[;;5;...;] n38=: 5{"_2 y y[;;5;...;] n39=: (<1 2){y Abbreviated (fewer indices than axes) n40=: _2{y Negative n41=: (<<<3){y Complementary n42=: (1 2;3 2;0 _2){y Scattered (non-scalar left argument)