Interval Index R←X⍸Y

Classic Edition: the symbol (Iota Underbar) is not available in Classic Edition, and Interval Index is instead represented by ⎕U2378.

X is an ordered non-scalar array that represents a set of intervals or ranges.

Note that the ith interval starts at X[i], then includes all subsequent values up to but not including X[i+1].

For example, if X is (1 3 5) it defines 4 intervals numbered 0 to 3 as follows.

 0 less than 1 <1 1 between 1 and 3 (≥1)∧(<3) 2 between 3 and 5 (≥3)∧(<5) 3 greater than or equal to 5 ≥5

If X is 'AEIOU' it defines 6 intervals numbered 0 to 5 as follows:

 0 before A ⎕UCS[0,⍳64] 1 between A and E ABCD 2 between E and I EFGH 3 between I and O IJKLMN 4 between O and U OPQREST 5 U and after UVWXYZ...

Y is an array of the same type (numeric or character) as X.

The result R is an integer array that identifies into which interval the corresponding value in Y falls.

Like dyadic (see Index Of), Interval Index works with major cells. For a vector these are its elements; for a matrix its rows, and so forth.

X and Y are compared using the same logic as monadic (see Grade Up (Monadic)) which is independent of ⎕CT and ⎕DCT.

⎕IO is an implicit arguments of Interval Index. In all the following examples, ⎕IO is 1.

Examples

```      10 20 30⍸11 1 31 21
1 0 3 2```

In the above example:

• 11 is between X and X so the answer is 1.
• 1 is less than X so the answer is 0
• 31 is greater than X[⍴X] so the answer is 3
• 21 is between X and X so the answer is 2.
```      'AEIOU' ⍸ 'DYALOG'
1 5 1 3 4 2```

And in the alphabetic example above:

• "D" is between X and X, so the answer is 1
• "Y" is after X[⍴X] so the answer is 5
• "A" is between X and X, so the answer is 1
• as so on ...

Example (Classification)

Commercially, olive oil is graded as follows:

• if its acidity is less than 0.8%, as "Extra Virgin"
• if its acidity is less than 2%, as "Virgin"
• if its acidity is less than 3.3%, as "Ordinary"
• otherwise, as "Lampante"
```     grades←'Extra Virgin' 'Virgin' 'Ordinary' 'Lampante'
acidity←0.8 2 3.3

samples←1.3 1.9 0.7 4 .6 3.2
acidity⍸samples
1 1 0 3 0 2
┌───┬────────────┐
│1.3│Virgin      │
├───┼────────────┤
│1.9│Virgin      │
├───┼────────────┤
│0.7│Extra Virgin│
├───┼────────────┤
│4  │Lampante    │
├───┼────────────┤
│0.6│Extra Virgin│
├───┼────────────┤
│3.2│Ordinary    │
└───┴────────────┘
```

Example (Data Consolidation by Interval)

x represents some data sampled in chronological order at timestamps t.

```      ⍴x
200000
x
3984300 2020650 819000 1677100 3959200 2177250 3431800 ...```
```      ⍴t
200000 3```
```      (10↑t) (¯10↑t)
┌─────┬────────┐
│0 0 0│23 59 54│
│0 0 0│23 59 55│
│0 0 0│23 59 56│
│0 0 0│23 59 56│
│0 0 0│23 59 58│
│0 0 2│23 59 58│
│0 0 3│23 59 59│
│0 0 3│23 59 59│
│0 0 4│23 59 59│
│0 0 5│23 59 59│
└─────┴────────┘```

u represents timestamps for 5-minute intervals:

```      ⍴u
288 3
(10↑u) (¯10↑u)
┌──────┬───────┐
│0  0 0│23 10 0│
│0  5 0│23 15 0│
│0 10 0│23 20 0│
│0 15 0│23 25 0│
│0 20 0│23 30 0│
│0 25 0│23 35 0│
│0 30 0│23 40 0│
│0 35 0│23 45 0│
│0 40 0│23 50 0│
│0 45 0│23 55 0│
└──────┴───────┘```

Therefore, the expression (u⍸t){+/⍵}⌸x summarises x in 5-minute intervals.

```      u ⍸ t
1 1 1 1 1 1 1 1 1 1 ... 288 288 288 288 288 288

(u⍸t) {+/⍵}⌸ x
1339083050 1365108650 1541944750 1393476000 1454347100 ...

(u⍸t) {(⍺⌷u),+/⍵}⌸ x
0  0 0 1339083050
0  5 0 1365108650
0 10 0 1541944750
0 15 0 1393476000
...
23 45 0 1388823150
23 50 0 1453472350
23 55 0 1492078850
```

Higher-Rank Left Argument

If X is a higher rank array, the function compares sub-arrays in Y with the major cells of X, where a major cell is a sub-array on the leading dimension of X with shape 1↓⍴X. In this case, the shape of the result R is (1-⍴⍴X)↓⍴Y.

Example

```      x ← ↑ 'Fi' 'Jay' 'John' 'Morten' 'Roger'
x
Fi
Jay
John
Morten
Roger
⍴x
5 6
y ← x ⍪ ↑ 'JD' 'Jd' 'Geoff' 'Alpha' 'Omega' 'Zeus  '
y
Fi
Jay
John
Morten
Roger
JD
Jd
Geoff
Alpha
Omega
Zeus

x ⍸ y
1 2 3 4 5 1 2 1 0 4 5
y ,⍪ x⍸y
Fi     1
Jay    2
John   3
Morten 4
Roger  5
JD     1
Jd     2
Geoff  1
Alpha  0
Omega  4
Zeus   5```

Further Example

```      ⍴x
5 6
⍴y
3 3 6
x
Fi
Jay
John
Morten
Roger
y
Fi
Jay
John

Morten
Roger
JD

Jd
Geoff
Alpha
x⍸y
1 2 3
4 5 1
2 1 0
```

Nested Array Example

A card-player likes to sort a hand into suits spades, hearts, diamond, clubs (fortunately alphabetic) and high-to-low within each suit.

```      suits←'Clubs' 'Diamonds' 'Hearts' 'Spades'
pack←,(⊂¨suits)∘.,1↓14 ⍝ 11=Jack ... 14=Ace
hand←↑(,pack)[7?52]
hand←hand[⍒hand;]
hand
┌────────┬──┐
├────────┼──┤
│Hearts  │12│
├────────┼──┤
│Hearts  │7 │
├────────┼──┤
│Hearts  │2 │
├────────┼──┤
│Diamonds│11│
├────────┼──┤
│Diamonds│9 │
├────────┼──┤
│Clubs   │8 │
└────────┴──┘

```

Another card, the 10 of diamonds is dealt. Where must it go in the hand ?

```      (⊖hand)⍸'Diamonds' 10 ⍝ left arg must be sorted up
2
(¯2↓hand)⍪'Diamonds' 10⍪¯2↑hand
┌────────┬──┐
├────────┼──┤
│Hearts  │12│
├────────┼──┤
│Hearts  │7 │
├────────┼──┤
│Hearts  │2 │
├────────┼──┤
│Diamonds│11│
├────────┼──┤
│Diamonds│10│
├────────┼──┤
│Diamonds│9 │
├────────┼──┤
│Clubs   │8 │
└────────┴──┘```

Note that if (∧/Y∊X) and X is sorted and ⎕CT=0 ,then x⍸y is the same as x⍳y.