Split: Difference between revisions
No edit summary |
mNo edit summary |
||
Line 1: | Line 1: | ||
{{Built-in|Split|↓}} is a [[monadic]] [[primitive function]] which reduces the [[rank]] of its [[argument]] by converting one of its [[axis|axes]] to one level of [[nested array model|nesting]]. The axis to move defaults to the last axis, but a different axis can be chosen using [[function axis]]. It shares its [[glyph]] <source lang=apl inline>↓</source> with the dyadic function [[Drop]]. Split is the inverse of [[Mix]] in the sense that the latter undoes the enclosing that Split introduced. | {{Built-in|Split|↓}} is a [[monadic]] [[primitive function]] which reduces the [[rank]] of its [[argument]] by converting one of its [[axis|axes]] to one level of [[nested array model|nesting]]. The axis to move defaults to the last axis, but a different axis can be chosen using [[function axis]]. It shares its [[glyph]] <source lang=apl inline>↓</source> with the dyadic function [[Drop]]. Split is the [[inverse]] of [[Mix]] in the sense that the latter undoes the enclosing that Split introduced. | ||
== Examples == | == Examples == |
Revision as of 11:47, 16 June 2020
↓
|
Split (↓
) is a monadic primitive function which reduces the rank of its argument by converting one of its axes to one level of nesting. The axis to move defaults to the last axis, but a different axis can be chosen using function axis. It shares its glyph ↓
with the dyadic function Drop. Split is the inverse of Mix in the sense that the latter undoes the enclosing that Split introduced.
Examples
The result of Split on a non-scalar array is always a nested array whose elements are vectors. The rank of ↓[K]Y
is ¯1+≢⍴Y
(original rank minus 1), its shape is (K≠⍳≢⍴Y)/⍴Y
(original shape with K-th axis removed), and the shape of each element is (⍴Y)[K]
.
⎕←Y←2 3 4⍴⎕A ⍝ 3D array ABCD EFGH IJKL MNOP QRST UVWX ↓Y ⍝ Last axis split; 2×3 array of length-4 vectors ┌────┬────┬────┐ │ABCD│EFGH│IJKL│ ├────┼────┼────┤ │MNOP│QRST│UVWX│ └────┴────┴────┘ ↓[2]Y ⍝ 2nd axis split; 2×4 array of length-3 vectors ┌───┬───┬───┬───┐ │AEI│BFJ│CGK│DHL│ ├───┼───┼───┼───┤ │MQU│NRV│OSW│PTX│ └───┴───┴───┴───┘ ↓↓Y ⍝ Split twice ┌────────────────┬────────────────┐ │┌────┬────┬────┐│┌────┬────┬────┐│ ││ABCD│EFGH│IJKL│││MNOP│QRST│UVWX││ │└────┴────┴────┘│└────┴────┴────┘│ └────────────────┴────────────────┘ (≡Y)(≢⍴Y) ⍝ Original array is depth 1, rank 3 1 3 (≡↓Y)(≢⍴↓Y) ⍝ Split array is depth 1+1, rank 3-1 2 2
Split is a no-op to a scalar.
2≡↓2 1
Alternatives
Most dialects do not have Split. Instead, the can use Enclose (⊂
) with bracket axis or the Rank operator:
↓Y ┌────┬────┬────┐ │ABCD│EFGH│IJKL│ ├────┼────┼────┤ │MNOP│QRST│UVWX│ └────┴────┴────┘ ⊂[3]Y ┌────┬────┬────┐ │ABCD│EFGH│IJKL│ ├────┼────┼────┤ │MNOP│QRST│UVWX│ └────┴────┴────┘ ⊂⍤1⊢Y ┌────┬────┬────┐ │ABCD│EFGH│IJKL│ ├────┼────┼────┤ │MNOP│QRST│UVWX│ └────┴────┴────┘
It is common to split a higher-rank array into its constituent major cells. The behaviour of Split on matrices might mislead to the belief that this is what the primitive does. However, it isn't so vectors or arrays of higher rank than 2. Instead, the solution is to use or ⊂[1↓⍳≢⍴Y]Y
or ⊂⍤¯1⊢Y
:
⊂[1↓⍳≢⍴Y]Y ┌────┬────┐ │ABCD│MNOP│ │EFGH│QRST│ │IJKL│UVWX│ └────┴────┘ ⊂⍤¯1⊢Y ┌────┬────┐ │ABCD│MNOP│ │EFGH│QRST│ │IJKL│UVWX│ └────┴────┘
External links
Lessons
Documentation