Vocabulary/barco

From J Wiki
Jump to: navigation, search

>> <<   Down to: Dyad   Back to: Vocabulary Thru to: Dictionary

|: y Transpose

Rank Infinity -- operates on x and y as a whole -- WHY IS THIS IMPORTANT?



Reverses the axes of an array y

   ii=: ] {. [: i. 10 #~ #   NB. utility verb: make self-indexing array
   ]y=: ii 2 3 4             NB. sample value of shape: 2 3 4
  0   1   2   3
 10  11  12  13
 20  21  22  23

100 101 102 103
110 111 112 113
120 121 122 123
   $ y
2 3 4
   $ |:y
4 3 2

   |:y
 0 100
10 110
20 120

 1 101
11 111
21 121

 2 102
12 112
22 122

 3 103
13 113
23 123

Common uses

Transpose a 2D matrix

   ]z=: 2 3 $ 'abcdef'   NB. sample mx of shape: 2 3
abc
def
   |:z
ad
be
cf


x |: y Rearrange Axes

Rank 1 _ -- operates on lists of x and the entirety of y -- WHY IS THIS IMPORTANT?



Rearranges the axes of an array y.

  • (x is an atom) — the axis having index x becomes the new last axis
  • (x is a list) — the axes having indices x become the new last axes.
   ii=: ] {. [: i. 10 #~ #   NB. utility verb: make self-indexing array
   ]y =: ii 2 3 4
  0   1   2   3
 10  11  12  13
 20  21  22  23

100 101 102 103
110 111 112 113
120 121 122 123

   0 |: y          NB. Move axis 0 to end. Old axes 1 and 2 become new axes 0 and 1
 0 100
 1 101
 2 102
 3 103

10 110
11 111
12 112
13 113

20 120
21 121
22 122
23 123

   $y
2 3 4
   $ 0 |: y        NB. New shape shows original axis 0 (size=2) is now the last axis
3 4 2

Repeat with a higher-rank y

   $ y=: ii 2 3 4 5 6
2 3 4 5 6

   x =: 2 1        NB. axes with sizes 4 and 3 respectively become the last axes
   $ x |: y
2 5 6 4 3

More Information

1. Use a special form of x in  x |: y to extract the diagonal of matrix y

   ] y =: 4 4 $ 'abcdefghijklmnop'
abcd
efgh
ijkl
mnop
   x =: < 0 1
   x |: y
afkp

More Uses

1. To cause the cells of a noun to correspond to a desired computation.

Reordering the axes of an array has two effects:

1. The index lists used to refer to atoms and cells are correspondingly reordered; 1. The axes that make up the cells are changed.

The best way to understand reordering is to assign a meaning to each axis. For example we could have an array data of information for a school district. The axes could have the following meanings:

axis 0 - the school
axis 1 - grade level
axis 2 - sex of students
axis 3 - core subject
axis 4 - a list of information for a given combination of school/grade/sex/subject

Each axis has associated with it an interpretation of the index of that axis, which might look like

SCHOOLS =: 'Ridgemont High';'Valley High';'Eastgate High'
GRADES =: 9;10;11;12
SEX =: 'M';'F'
SUBJECT =: 'Math';'Science';'English';'History';'Language'
INFO =: 'Number of students';'25th pctile grade';'50th pctile grade';'75th pctile grade'
NB. Create a data table where each atom shows its index list
data =: }:@;@:((,&'_') each) each { {.@;:@": every each SCHOOLS;GRADES;SEX;SUBJECT;<INFO

With this setup, (<1 1 0 2 3) { data would be the 75th-pctile English grade for 10th-grade boys at Valley High.

   (<1 1 0 2 3) { data
+------------------------+
|Valley_10_M_English_75th|
+------------------------+

Each arrangement of axes makes some computations easier than others. It is easy to compute results that correspond to cells of a noun. Here, the 1-cell is the information line. It would be easy to compute a statistic on each combination of school/grade/sex/subject.

It would also be easy to calculate a result for each combination of school/grade/sex, using all the subject data for that combination, because the subject information makes up the 2-cells of data.

   (<1 1 0) { data   NB. A single 2-cell
+---------------------------+-------------------------+-------------------------+-------------------------+
|Valley_10_M_Math_Number    |Valley_10_M_Math_25th    |Valley_10_M_Math_50th    |Valley_10_M_Math_75th    |
+---------------------------+-------------------------+-------------------------+-------------------------+
|Valley_10_M_Science_Number |Valley_10_M_Science_25th |Valley_10_M_Science_50th |Valley_10_M_Science_75th |
+---------------------------+-------------------------+-------------------------+-------------------------+
|Valley_10_M_English_Number |Valley_10_M_English_25th |Valley_10_M_English_50th |Valley_10_M_English_75th |
+---------------------------+-------------------------+-------------------------+-------------------------+
|Valley_10_M_History_Number |Valley_10_M_History_25th |Valley_10_M_History_50th |Valley_10_M_History_75th |
+---------------------------+-------------------------+-------------------------+-------------------------+
|Valley_10_M_Language_Number|Valley_10_M_Language_25th|Valley_10_M_Language_50th|Valley_10_M_Language_75th|
+---------------------------+-------------------------+-------------------------+-------------------------+

To operate on such a cell you would have

   subjinfoverb =: verb define
NB. y is a 5x4 table of info for each subject
...
)
   school_grade_sex =: subjinfoverb"2 data   NB. Compute for each combination of school/grade/sex

But it would not be easy to compute something for every combination of school/grade/subject. That information is spread across cells.

This is where reordering the axes comes in. To do a computation for each school/grade/subject, make those axes the leading axes of the array, leaving sex/info as the last 2 axes. Then each 2-cell will have all the information for a single combination of school/grade/subject.

   $data   NB. Data array, school/grade/sex/subject/info
3 4 2 5 4
   $ 0 1 3 2 4 |: data  NB. school/grade/subject/sex/info
3 4 5 2 4
   $ 2 4 |: data  NB. alternate form
3 4 5 2 4
   (<1 1 0) { 2 4 |: data   NB. A single 2-cell of the reshaped data
+-----------------------+---------------------+---------------------+---------------------+
|Valley_10_M_Math_Number|Valley_10_M_Math_25th|Valley_10_M_Math_50th|Valley_10_M_Math_75th|
+-----------------------+---------------------+---------------------+---------------------+
|Valley_10_F_Math_Number|Valley_10_F_Math_25th|Valley_10_F_Math_50th|Valley_10_F_Math_75th|
+-----------------------+---------------------+---------------------+---------------------+

As illustrated in the last example, you don't have to give the entire list of axes. The axes you specify are moved to be the last axes of the result.

   sexinfoverb =: verb define
NB. y is a 2x4 table of info for each sex
...
)
   school_grade_subject =: sexinfoverb"2 (0 1 3 2 4) |: data   NB. Compute for each combination of school/grade/sex

Any index list into the transposed array must be transposed accordingly. If you needed to get to that 75th-pctile English grade for 10th-grade boys at Valley High, the index list into the transposed array would be (<1 1 2 0 3)

   (<1 1 2 0 3) { 2 4 |: data
+------------------------+
|Valley_10_M_English_75th|
+------------------------+