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=: ([:(</\&.|.i.1:)' '"_ ~: ])"1

ISO last nonblank in rows of table y

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

(Boxed) indices from rows of open table y

m39=: $ #: (# i.@$)@,

Open ISO 1s in array y (inverse of m85)

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