The function Select (β) reorganizes the array π© along one or more axes based on indices given by π¨. The result has the same depth as π©, since its elements are always elements of π©. This means it differs from Pick (β), which takes elements from π© but can arrange them in any nested structure, including returning an element directly.
The monadic form First Cell (β) gets the major cell with index 0, so that βπ© is identical to 0βπ©.
The major cells of an array are arranged along the first axis and numbered starting at 0. For a natural number π¨, Select returns the major cell of π© with index π¨.
2 β "abcdef" # An enclosed element βΒ· Β·'c' β 2 β "abcdef" # Pick gets a non-enclosed element 'c' 2 β >"nul"βΏ"one"βΏ"two"βΏ"tre"βΏ"for" "two" 0 β <5 # No first axis to select from Error: β: π© cannot be a unit
As a major cell, the result has rank one less than π© and shape 1ββ’π©. Of course π© must have at least one axis to select along, or there are no major cells and you'll get an error.
The index π¨ has to be an integer less than β π©. It can be negative, in which case it must be greater than or equal to -β π©. Negative indices select from the end of π©, in that Β―1 indicates the last major cell and -β π© indicates the first. If β π© is 0, then no index is valid.
Β―2 β "abcdef" βΒ· Β·'e' β 0 β "" Error: β: Indexing out-of-bounds (0βπ¨, 0β‘β π©)
The monadic case First Cell (βπ©) is identical to 0βπ©. It has the same restrictions: π© must have rank 1 or more, and length 1 or more.
β "abc" βΒ· Β·'a' β β "abc"β"def" "abc" β β "abc" "abc" β 'a' Error: β: Argument cannot be an atom
If π¨ is an array of numbers (including any empty array), then each number indicates a major cell of π©. In the simplest case, a list of numbers gives a result with the same rank as π© but the length of π¨.
2βΏ3βΏ3βΏ0βΏ4βΏ1 β "OlZEt" "ZEEOtl" β¨β© β "OlZEt" β¨β©
To find the first and last cells of π©, use 0βΏΒ―1 for the left argument.
β’ m β 3βΏ5βΏ7βΏ11 |β ΓΛβ7 ββ β΅ 0 1 1 0 1 1 0 0 1 4 4 1 0 1 0 1 4 2 2 4 1 0 1 4 9 5 3 3 β 0βΏΒ―1 β m ββ β΅ 0 1 1 0 1 1 0 0 1 4 9 5 3 3 β
More generally, π¨ can be an array of any rank. Each of its 0-cellsβcontaining a single numberβis replaced with a cell of π© in the result. The result's shape is then made up of the shape of π¨ and the major cell shape of π©: it's (β’π¨)βΎ1ββ’π©.
When π© is a list, the result has the same shape as π¨. Elements of π¨ are replaced one-for-one with elements of π©.
2|m ββ β΅ 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 β (2|m) β " *" ββ β΅" ** ** * * * * * * ****" β
Another special case is when π¨ is a unit. Now the result shape will be the major cell shape of π©. In fact it's the same as the atom case above, that is, for a number n, (<n)βπ© is the same as nβπ©.
The general case can result in a complicated array. Remember that the initial axes come from π¨ while later ones come from π©.
"awA0" +β β4 ββ β΅"abcd wxyz ABCD 0123" β 2 β β4 ββ β΅ 0 1 1 2 2 3 β (2 β β4) β "awA0" +β β4 ββ β"abcd wxyz Β·wxyz ABCD Β·ABCD 0123" β
Select also allows π¨ to apply to multiple axes of π© simultaneously. For this case, π¨ must be a non-empty list (or unit array) where every element is an array of indices.
β¨2βΏ1, 3βΏ0βΏ0β© β β3βΏ4 ββ β΅ β¨ 2 3 β© β¨ 2 0 β© β¨ 2 0 β© β¨ 1 3 β© β¨ 1 0 β© β¨ 1 0 β© β
Using a range for π© shows the structure of the selected elements more clearly, because each element is its own index. Each element of π¨ acts independently, giving a structure like the Table modifier.
While π¨ must have rank one or less, its elements can have any rank. When the elements are units, the corresponding axis of π© disappears from the result. We can select a 0-cell of π© in this way, although the more common case of selecting an element is handled by Pick.
β¨<4,<5,<1β© β (3β₯10)β₯β1e3 βΒ· Β· 451 β β¨ 4, 5, 1β© β (3β₯10)β₯β1e3 451
However, the <Β¨βΈβ construct can select a cell of any rank from π©, because β π¨ can be smaller than =π© (okay, not quite: an empty list is always interpreted as a list of indices, so it's impossible to select the full-rank cell π©). Below, π¨ is missing one axis and the result is a 1-cell, or row, of π©.
β¨4,5β© <Β¨βΈβ (3β₯10)β₯β1e3 β¨ 450 451 452 453 454 455 456 457 458 459 β©
If an element of π¨ has rank more than 1, it increases the rank of π© rather than decreasing it. The general rule is that in the result, one axis of π© is replaced by all the axes of the corresponding element of π¨ (trailing axes are unchanged). So the final shape β’π¨βπ© is (βΎβ’Β¨π¨)βΎπ¨β βΈββ’π©. But this shape doesn't affect the elements retrieved from π©. In all cases, using β₯Β¨π¨ for the left argument and then reshaping the result would yield the same value.
Selection only ever applies to leading axes of π©. However, you can skip some leading axes using Rank modifiers Λ or β, to select on any contiguous set of axes. In particular, use the one-axis case π¨βΈββ(-k) π© to select along axis k of π©.