>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases

# 4B. Locating And Selecting

In dealing with large amounts of data it is frequently necessary to find the location or locations of a particular datum, sometimes a particular value, sometimes one satisfying certain criteria. The verbs below give examples of techniques that can be used. In the first set, indices are the result. The result of each of these can be used to select the item indexed, using an expression such as

`(f y) { y or (x f y) { y.`

`m0=: \:` | Downgrade
`m1=: {.@\:` | Index of (IO) first occurrence of max
`m2=: i.>./` | IO first occurrence of maximum of y
`m3=: {:@/:` | IO last occurrence of maximum of y
`m4=: {.@/:` | IO first occurrence of minimum of y
`m5=: {:@\:` | IO last occurrence of minimum of y
`m6=: i.<./` | IO first occurrence of minimum of y
`d7=: ~: i. 1:` | IO first item where x and y differ
`m8=: # - 1: #.~ ] = ' '"_` | IO last nonblank in y
`d9=: <./@i.` | IO first occurrence in x of any item of y
`d10=: [ + i.&1@}.` | IO first 1 in y after first x items
`m11=: ] i. 1:` | IO first 1 in y
`d12=: i.` | IO items of y in key x
`d13=: <:@($@]) - |.@] i. [` | IO last item of x in y
`d14=: (<:@(#@[) - |.@[ i. ])"1` | IO last occurrence of y in x
`d15=: |.@[ i. ]` | IO last occurrence of y in x, from rear
`d16=: E. # i.@#@]` | Indices of (ISO) beginnings of x in y
`d17=: e.~&, # i.@#@]` | ISO all occurrences of items of y in x
`d18=: =#[:i.[:#[` | ISO all occurrences of items of y in x
`m19=: +/{.\:` | ISO 1s in Boolean list y
`m20=: [: m38 m39` | ISO 1s in Boolean table y
`m21=: ] i."1 ' '"_` | ISO first blank in rows of table y
`m22=: ([:(</\&.|.i.1:)' '"_ ~: ])"1` | ISO last nonblank in rows of table y
`m23=: <:@(+/\) i. i.@(+/)` | ISO 1s in Boolean list y
`m24=: ] # [: i. #` | ISO 1s in Boolean list y
`d25=: ([: $ ]) #."1 ([: > [)` | Indices from (boxed) indices x to table y
`d26=: +/i.` | ISO infixes of length y, starting at x
`m27=: [: i. #` | All indices of list y
`m28=: [: { [: i.&.> $` | Catalog of indices of y, in shape of y
`m29=: +/\@}:@(0:,])` | Indices of start positions from counts y
`m30=: $ #: [: i. [: # ,` | Table of all indices of array y (odometer)
`d31=: {@(;/&i.)` | Catalog of all pairs from i.x and i.y
`d32=: [: m20 [ e. [: , ]` | Indices in x of atoms of list y
`m33=: a."_ i. ]` | Index in a. of character y
`d34=: i."_1` | Itemwise index in table x of rows of y
`d35=: E. i. 1:` | IO first occurrence of array x in y
`d36=: <:@(+/@(</))` | Index in classes x of y
`d37=: i.` | Index in rows of table x of list y
`m38=: <"1` | (Bxed) indices from rows of open table y
`m39=: $ #: (# i.@$)@,` | Open ISO 1s in array y (inverse of
`m40=: m20@m43` | ISO free zeros in formatted y
`m41=: m20@m82` | IO saddle point in y
`m42=: <:@(+/\) i. i.@(+/)` | ISO 1s ub Boolean list y

Location of an item in an array y can also be given by means of a Boolean list x having the same number of items as y. Typically such a Boolean list can be formed using a relational or membership expression. Such a list characterizes the items of an array in a certain way. There can be `2^#y` ways of forming such a Boolean list, each way characterizing the array in a different and unique way. The importance of such a Boolean list is that it can be used to select items from by an expression such as `(f y) # y` or `(x f y) # y`. The following expressions give some of the ways such Boolean lists can be formed.

`m43=: ' 0 '"_ E."1 ' '"_ ,. ] ,. ' '"_` | Locate free zeros in formatted y
`m44=: =&''''` | Locate quotes in y
`m45=: = >./` | Locate all instances of maximum of y
`m46=: '.'&~:` | Exclude periods in y
`m47=: e.&' 0123456789'` | Locate digits and blanks in y
`d48=: E.` | Locate beginning points of pattern x in y
`m49=: 2&=@(+/@(0&=@(|/~@i.)))` | Locate primes less than y
`d50=: i.@(#@])e.[` | Locate indices x in y
`d51=: ] e.~ [: i. [: # [` | Locate indices y in x
`m52=: ] e.~ [: i. [: >: >./` | Locate indices y
`m53=: *./ .=&' '` | Locate blank rows in table y
`m54=: ] -:"1 [: {. ' '"_ , ]` | Locate blank rows in table y
`m55=: ~:` | Locate first instance of each item
`m56=: [: *./\ ' '"_ = ]` | Locate leading blanks
`m57=: [: *./\. ' '"_ = ]` | Locate trailing blanks
`m58=: 2:+./\0:,2:|+/\@(=&'''')` | Locate text between and including quotes
`m59=: 2:*./\0:,2:|+/\@(=&'''')` | Locate text between quotes
`m60=: 2: </\ 0: , ]` | Locate first 1 in each group of 1s in y
`m61=: 2: >/\ 0: , ]` | Locate first 0 after each group of 1s in y
`d62=: * $ -@] {. 1:` | Locate ends of x fields of length y
`d63=: * $ ] {. 1:` | Locate starts of x fields of length y
`m64=: 1: ,~ 2: ~:/\ ]` | Loc ends of fields of identical atoms in y
`m65=: 1: , 2: ~:/\ ]` | Loc starts of fields of identical atoms in y
`m66=: 1: ,~ 2: ~:/\ ]` | Loc where atom differs from nxt rgt in y
`m67=: 1: , 2: ~:/\ ]` | Loc where atom differs next left in y
`m68=: ] > [: }. 0: ,~ ]` | Loc last 1 in each group of 1s in y
`m69=: ] > [: }: 0: , ]` | Loc first 1 in each group of 1s
`d70=: 0: = [ | [: i. [: # ]` | Loc every xth item of y
`m71=: 2: | [: >: [: i. #` | Loc every 2d item of y
`d72=: 0: = |` | Loc atoms of y divisible by x
`d73=: [: -. [ e.~ [: i. ]` | Loc atoms of i. y not in x
`d74=: [ e.~ [: i. ]` | Loc atoms of i.y in x
`d75=: i. = [: # [` | Loc items of y not in x
`m76=: 0: *. ]` | Loc nothing
`d77=: <:` | Loc where x implies y
`d78=: >` | Loc where x but not y
`d79=: ~:` | Loc exclusive or of x and y
`d80=: =` | Loc Kronecker delta of x and y
`d81=: #@[ > /:@(] ,~ i.@#@[)` | Loc fills formed by expanding y by x
`m82=: (= <./"1) *. (="1 >./)` | Loc saddle points of table y
`m83=: [: #: [: i. 2: ^ #` | Loc all subsets of order #n (truth table)
`m84=: [: #: [: i. 2: ^ ]` | Loc all subsets of order n (truth table)
`m85=: 1: [`(m38@])`(m93@])} ]` | Loc indices y in large enough table (connection matrix from table of indices) (inverse of m39)
`m86=: 1: [`(<"1@])`((>:@(>./@]) $0:)@]) } ]` | Loc indices y in large enough table
`m87=: ' '&=` | Loc blanks in y
`m88=: =` | Loc each item of set of y (position or distribution matrix)
`m89=: (#~ (1: ~: +/"1))@=` | Table in which each row Locs an infix in y of 2 or more consecutive equal items
`d90=: [: , [ {.&> ] (`<@#"0) 1: | Expansion mask for fields of length y to uniform field of length |x
`m91=: _8&d90` | Expansion mask for fields of length y to uniform right justified fields of length 8
`m92=: [: -. [: *./\. m53` | Loc rows preceding trailing blank rows
`m93=: 0: $~ [: >: >./` | Loc nothing in table large enough for y
`d94=: [ -:"1 ([: # [) {."1 ]` | Loc rows of y beginning with x
`m95=: ' '&(+./ .~:)` | Loc nonblank columns
`m96=: [: -. [: *./\. ' '"_ = ]` | Exclude trailing blanks
`m97=: m105@m95` | Exclude leading blank columns
`m98=: +. 1&,@}:` | Loc 1s and 1st 0 in each group of 0s
`m99=: m98@m95` | Exclude all but first blank columns
`m100=: *./ .=&' '` | Loc blank rows
`m101=: 1: , 2: +./\ ]` | Exclude all 0s but the first in a group
`m102=: m101@m100` | Exclude all but first blank rows
`m103=: +./\.` | Loc items left of leftmost trailing 0
`m104=: m103@m95` | Exclude trailing blank columns
`m105=: +./\` | Loc items right of rightmost leading 0
`m106=: *./\` | Exclude all 1s right of first 0
`m107=: *./\.` | Exclude all 1s left of last 0
`m108=: +./ .~:&' '` | Loc nonblank rows
`m109=: m103@m108` | Exclude trailing blank rows
`m110=: m105@m108` | Exclude leading blank rows
`m111=: m98@m95` | Include only first of group of blank cols
`m112=: m98@m108` | Include only first of group of blank rows
`d113=: +./ .~:"1` | Loc rows of x having atoms not y
`d114=: -:"1` | Loc rows of x matching y
`d115=: ,@,. # $&1 0@#@,` | Alternate i{x 1s and i{y 0s
`m116=: # $&1 0@#` | Alternate i{x 1s, (1+i){x 0s, etc
`m117=: +./\ *. +./\.` | Loc atoms between leading & trailing 0s
`m118=: *. *./\@(= +./\)"1` | Loc first infix of 1s
`m119=: ' '&~:` | Loc nonblanks
`d120=: ]*.*.(]e.#)+/\@(2:</\0:,])@]` | Loc groups of ones in y indicated by x
`m121=: +.~:/\` | Loc 1s in y and 0s between pairs of 1s
`m122=: -. *. ~:/\` | Loc 0s between pairs of 1s
`m123=: </\` | Loc leftmost 1
`m124=: <:/\` | Loc 1s and all 0s following leftmost 0
`m125=: ~:/\` | Loc where odd number of 1s are at left

If `L` is a function that determines locations (that is, indices) in an argument according to some criteria, then the function `L { ]` selects the indicated portions of the argument. For example:

`d126=: #"1` | 1s in x select from each row (list) of y
`d127=: #.@[ { ]` | Boolean list x as integer selecting from y
`d128=: ([: <"1 [) { ]` | Scattered index table x select from y
`d129=: {` | Selecting x from y
`d130=: >./ . #` | Select maximum of x located by y
`m131=: m41 { ]` | Select saddle point(s) of y
`m132=: ([:-.(1:,''"_=])#.1:)}.]` | Delete trailing blanks
`m133=: m104 #"1 ]` | Delete trailing blank columns
`m134=: m97 #"1 ]` | Delete leading blank columns
`m135=: m110 # ]` | Delete leading blank rows
`m136=: m109 # ]` | Delete trailing blank rows
`m137=: m98@m108 # ]` | Delete repeated blank rows
`m138=: m98@m95 #"1 ]` | Delete repeated blank columns
`m139=: ] -. [: {. ' '"_ , ]` | Delete blank rows
`m140=: m108 # ]` | Delete blank rows
`m141=: m95 #"1 ]` | Delete blank columns
`m142=: ([: m117 ] ~: ' '"_) # ]` | Delete leading & trailing blanks
`m143=: +/@(*./\@(' '&=)) }. ]` | Delete leading blanks
`m144=: #~ ([: +./\. ' '&~:)` | Delete trailing blanks
`d145=: ,` | Append atom or list to table
`d146=: ,.` | List or atom as new column of table
`m147=: ~.` | Delete repeated items
`m148=: */@}:@$` | Number of rows in array y
`m149=: #~(+. 1&|.@(></\))@(' '&~:)` | Delete extra blanks
`d150=: ,.` | Join along last dimension
`d151=: ,.&.>/` | Join items of boxed array

>> << Ndx Usr Pri Phr Dic Rel Voc !: wd Help Phrases