Split: Difference between revisions
m (Text replacement  "</source>" to "</syntaxhighlight>") 
m (Text replacement  "<source" to "<syntaxhighlight") 

Line 1:  Line 1:  
{{BuiltinSplit↓}} is a [[monadic]] [[primitive function]] which reduces the [[rank]] of its [[argument]] by converting one of its [[axisaxes]] to one level of [[nested array modelnesting]]. The axis to move defaults to the last axis, but a different axis can be chosen using [[function axis]]. It shares its [[glyph]] <  {{BuiltinSplit↓}} is a [[monadic]] [[primitive function]] which reduces the [[rank]] of its [[argument]] by converting one of its [[axisaxes]] to one level of [[nested array modelnesting]]. The axis to move defaults to the last axis, but a different axis can be chosen using [[function axis]]. It shares its [[glyph]] <syntaxhighlight lang=apl inline>↓</syntaxhighlight> 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 ==  
The result of Split on a non[[scalar]] array is always a [[nested array]] whose elements are [[vectorvectors]]. The [[rank]] of <  The result of Split on a non[[scalar]] array is always a [[nested array]] whose elements are [[vectorvectors]]. The [[rank]] of <syntaxhighlight lang=apl inline>↓[K]Y</syntaxhighlight> is <syntaxhighlight lang=apl inline>¯1+≢⍴Y</syntaxhighlight> (original rank minus 1), its [[shape]] is <syntaxhighlight lang=apl inline>(K≠⍳≢⍴Y)/⍴Y</syntaxhighlight> (original shape with Kth axis removed), and the shape of each element is <syntaxhighlight lang=apl inline>(⍴Y)[K]</syntaxhighlight>.  
<  <syntaxhighlight lang=apl>  
⎕←Y←2 3 4⍴⎕A ⍝ 3D array  ⎕←Y←2 3 4⍴⎕A ⍝ 3D array  
ABCD  ABCD  
Line 41:  Line 41:  
Split is a noop to a [[scalar]].  Split is a noop to a [[scalar]].  
<  <syntaxhighlight lang=apl>  
2≡↓2  2≡↓2  
1  1  
Line 47:  Line 47:  
== Alternatives ==  == Alternatives ==  
Most dialects do not have Split. Instead, they can use [[Enclose]] (<  Most dialects do not have Split. Instead, they can use [[Enclose]] (<syntaxhighlight lang=apl inline>⊂</syntaxhighlight>) with [[bracket axis]] or the [[Rank operator]]:  
<  <syntaxhighlight lang=apl>  
↓Y  ↓Y  
┌────┬────┬────┐  ┌────┬────┬────┐  
Line 68:  Line 68:  
└────┴────┴────┘  └────┴────┴────┘  
</syntaxhighlight>  </syntaxhighlight>  
It is common to split a higher[[rank]] array into its constituent [[major cellmajor cells]]. The behaviour of Split on matrices might mislead to the belief that this is what the primitive does. However, it isn't so for vectors or arrays of higher rank than 2. Instead, the solution is to use or <  It is common to split a higher[[rank]] array into its constituent [[major cellmajor cells]]. The behaviour of Split on matrices might mislead to the belief that this is what the primitive does. However, it isn't so for vectors or arrays of higher rank than 2. Instead, the solution is to use or <syntaxhighlight lang=apl inline>⊂[1↓⍳≢⍴Y]Y</syntaxhighlight> or <syntaxhighlight lang=apl inline>⊂⍤¯1⊢Y</syntaxhighlight>:  
<  <syntaxhighlight lang=apl>  
⊂[1↓⍳≢⍴Y]Y  ⊂[1↓⍳≢⍴Y]Y  
┌────┬────┐  ┌────┬────┐ 
Latest revision as of 10:55, 11 September 2022
↓

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 nonscalar 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 Kth 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 length4 vectors
┌────┬────┬────┐
│ABCD│EFGH│IJKL│
├────┼────┼────┤
│MNOP│QRST│UVWX│
└────┴────┴────┘
↓[2]Y ⍝ 2nd axis split; 2×4 array of length3 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 31
2 2
Split is a noop to a scalar.
2≡↓2
1
Alternatives
Most dialects do not have Split. Instead, they 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 higherrank 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 for 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