# 4B. Locating & 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 .

 m1=: i.>./ Index of (IO) first occurrence of maximum of y m2=: i:>./ IO last occurrence of maximum of y m3=: i.<./ IO first occurrence of minimum of y m4=: i:<./ IO last occurrence of minimum of y m5=: {.@\: IO first occurrence of maximum of y m6=: {.@/: IO first occurrence of minimum of y d7=: ~:i.1: IO first item where x and y differ d8=: e.i.1: IO first occurrence in x of any item of y m9=: ' '&(=i:0:) IO last nonblank in y d10=: [ + i.&1@}. IO first 1 in y after first x items m11=: ] i. 1: IO first 1 in y m12=: ] i: 1: IO last 1 in y 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=: I.@:E. 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=: ([:( [) 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=: <:@(+/@(

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 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:

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&|.@(>/ Join items of boxed array