Rotate: Difference between revisions
(→Documentation: BQN link) |
m (Text replacement - "</source>" to "</syntaxhighlight>") |
||
Line 1: | Line 1: | ||
{{Built-ins|Rotate|⌽|⊖}} is a [[dyadic]] [[primitive function]] which "rotates" the [[elements]] of the right [[argument]] around a specified [[axis]]. The name Rotate is typically used for the primitive <source lang=apl inline>⌽</ | {{Built-ins|Rotate|⌽|⊖}} is a [[dyadic]] [[primitive function]] which "rotates" the [[elements]] of the right [[argument]] around a specified [[axis]]. The name Rotate is typically used for the primitive <source lang=apl inline>⌽</syntaxhighlight>, which rotates along the last axis, while <source lang=apl inline>⊖</syntaxhighlight>, which rotates along the first axis, is called "Rotate First" or similar. APLs with [[function axis]] allow to choose a different axis from the default one. In the [[leading axis model]], specifying an axis is discouraged in favor of using <source lang=apl inline>⊖</syntaxhighlight> with the [[Rank operator]]. | ||
Rotate and Rotate First share the [[glyph|glyphs]] <source lang=apl inline>⌽</ | Rotate and Rotate First share the [[glyph|glyphs]] <source lang=apl inline>⌽</syntaxhighlight> and <source lang=apl inline>⊖</syntaxhighlight> with monadic functions [[Reverse]] and Reverse First, respectively. | ||
== Examples == | == Examples == | ||
Line 14: | Line 14: | ||
¯4⌽1 2 3 4 5 6 7 | ¯4⌽1 2 3 4 5 6 7 | ||
4 5 6 7 1 2 3 | 4 5 6 7 1 2 3 | ||
</ | </syntaxhighlight> | ||
Rotate on a [[matrix]] rotates the elements around horizontally (to the left), while Rotate First does vertically (upwards). | Rotate on a [[matrix]] rotates the elements around horizontally (to the left), while Rotate First does vertically (upwards). | ||
Line 31: | Line 31: | ||
IJKL | IJKL | ||
ABCD | ABCD | ||
</ | </syntaxhighlight> | ||
Higher-[[rank]] arrays can be rotated on an arbitrary axis if [[function axis]] or [[Rank operator]] is supported: | Higher-[[rank]] arrays can be rotated on an arbitrary axis if [[function axis]] or [[Rank operator]] is supported: | ||
Line 64: | Line 64: | ||
│IJKL│MNOP│VWXU│ | │IJKL│MNOP│VWXU│ | ||
└────┴────┴────┘ | └────┴────┴────┘ | ||
</ | </syntaxhighlight> | ||
Usage of non-scalar X differs between implementations. [[Dyalog APL]] allows to specify different amount of rotation for different "columns" or 1-dimensional [[subarray|subarrays]] which Rotate is applied to. [[J]] allows to specify rotations for multiple leading axes at once. | Usage of non-scalar X differs between implementations. [[Dyalog APL]] allows to specify different amount of rotation for different "columns" or 1-dimensional [[subarray|subarrays]] which Rotate is applied to. [[J]] allows to specify rotations for multiple leading axes at once. | ||
Line 77: | Line 77: | ||
4 1 2 3 | 4 1 2 3 | ||
3 4 1 2 | 3 4 1 2 | ||
</ | </syntaxhighlight>{{Works in|[[Dyalog APL]]}} | ||
<source lang=j> | <source lang=j> | ||
Line 88: | Line 88: | ||
10 11 8 9 | 10 11 8 9 | ||
2 3 0 1 | 2 3 0 1 | ||
</ | </syntaxhighlight>{{Works in|[[J]]}} | ||
== Description == | == Description == | ||
Line 94: | Line 94: | ||
In languages with [[function axis]], exactly one argument axis may be specified. | In languages with [[function axis]], exactly one argument axis may be specified. | ||
Rotating a [[scalar]] always yields that scalar unchanged. Otherwise, Rotate operates on a particular axis of its right argument. This axis is the specified axis if one is given, and otherwise the last axis for <source lang=apl inline>⌽</ | Rotating a [[scalar]] always yields that scalar unchanged. Otherwise, Rotate operates on a particular axis of its right argument. This axis is the specified axis if one is given, and otherwise the last axis for <source lang=apl inline>⌽</syntaxhighlight>, or the first axis for <source lang=apl inline>⊖</syntaxhighlight>. | ||
The result array has the same [[shape]] and [[elements]] as the right argument array, but the elements cyclically move around the rotation axis. Consequently if the length of this axis is 0 or 1 then rotation has no effect. | The result array has the same [[shape]] and [[elements]] as the right argument array, but the elements cyclically move around the rotation axis. Consequently if the length of this axis is 0 or 1 then rotation has no effect. | ||
Line 100: | Line 100: | ||
=== APL model === | === APL model === | ||
The rotation of a vector <source lang=apl inline>Y</ | The rotation of a vector <source lang=apl inline>Y</syntaxhighlight> by <source lang=apl inline>X</syntaxhighlight> units may be written in any APL, assuming <source lang=apl inline>⎕IO←0</syntaxhighlight>, as <source lang=apl inline>Y[(⍴Y)|X+⍳⍴Y]</syntaxhighlight>. To rotate an arbitrary array [[Squad indexing]] with axis (or [[Rank operator|rank]]) is helpful. | ||
<source lang=apl> | <source lang=apl> | ||
RotateAxis ← { ⍝ R ← X (K RotateAxis) Y | RotateAxis ← { ⍝ R ← X (K RotateAxis) Y | ||
Line 108: | Line 108: | ||
(⊂l|⍺+⍳l) ⌷[⍺⍺] ⍵ ⍝ Rotate with indexing | (⊂l|⍺+⍳l) ⌷[⍺⍺] ⍵ ⍝ Rotate with indexing | ||
} | } | ||
</ | </syntaxhighlight> | ||
== External links == | == External links == |
Revision as of 21:27, 10 September 2022
⌽ ⊖
|
Rotate (⌽
, ⊖
) is a dyadic primitive function which "rotates" the elements of the right argument around a specified axis. The name Rotate is typically used for the primitive <source lang=apl inline>⌽</syntaxhighlight>, which rotates along the last axis, while <source lang=apl inline>⊖</syntaxhighlight>, which rotates along the first axis, is called "Rotate First" or similar. APLs with function axis allow to choose a different axis from the default one. In the leading axis model, specifying an axis is discouraged in favor of using <source lang=apl inline>⊖</syntaxhighlight> with the Rank operator.
Rotate and Rotate First share the glyphs <source lang=apl inline>⌽</syntaxhighlight> and <source lang=apl inline>⊖</syntaxhighlight> with monadic functions Reverse and Reverse First, respectively.
Examples
The left argument is usually restricted to a scalar. Rotate on a vector right argument rotates the elements to the left, wrapping around as necessary. The left argument can be large or negative.
<source lang=apl>
3⌽1 2 3 4 5 6 7
4 5 6 7 1 2 3
8⌽1 2 3 4 5 6 7
2 3 4 5 6 7 1
¯4⌽1 2 3 4 5 6 7
4 5 6 7 1 2 3 </syntaxhighlight>
Rotate on a matrix rotates the elements around horizontally (to the left), while Rotate First does vertically (upwards).
<source lang=apl>
⎕←M←3 4⍴⎕A
ABCD EFGH IJKL
2⌽M ⍝ Horizontally rotate twice
CDAB GHEF KLIJ
1⊖M ⍝ Vertically rotate once
EFGH IJKL ABCD </syntaxhighlight>
Higher-rank arrays can be rotated on an arbitrary axis if function axis or Rank operator is supported:
<source lang=apl>
⎕←M←2 3 4⍴⎕A
ABCD EFGH IJKL
MNOP QRST UVWX
(1⌽[1]M)(1⌽[2]M)(1⌽[3]M) ⍝ Rotate once over 1st, 2nd, or 3rd axis, using function axis
┌────┬────┬────┐ │MNOP│EFGH│BCDA│ │QRST│IJKL│FGHE│ │UVWX│ABCD│JKLI│ │ │ │ │ │ABCD│QRST│NOPM│ │EFGH│UVWX│RSTQ│ │IJKL│MNOP│VWXU│ └────┴────┴────┘
(1⊖⍤3⊢M)(1⊖⍤2⊢M)(1⊖⍤1⊢M) ⍝ Same as above, using Rotate First with Rank
┌────┬────┬────┐ │MNOP│EFGH│BCDA│ │QRST│IJKL│FGHE│ │UVWX│ABCD│JKLI│ │ │ │ │ │ABCD│QRST│NOPM│ │EFGH│UVWX│RSTQ│ │IJKL│MNOP│VWXU│ └────┴────┴────┘ </syntaxhighlight>
Usage of non-scalar X differs between implementations. Dyalog APL allows to specify different amount of rotation for different "columns" or 1-dimensional subarrays which Rotate is applied to. J allows to specify rotations for multiple leading axes at once.
<source lang=apl>
⎕←M←3 4⍴⍳4
1 2 3 4 1 2 3 4 1 2 3 4
1 3 2⌽M ⍝ Rotate 1st row once, 2nd row thrice, and 3rd row twice
2 3 4 1 4 1 2 3 3 4 1 2
</syntaxhighlight>
<source lang=j>
i.3 4
0 1 2 3 4 5 6 7 8 9 10 11
1 2|.i.3 4 NB. Rotate vertically once, horizontally twice 6 7 4 5
10 11 8 9
2 3 0 1
</syntaxhighlight>
Description
In languages with function axis, exactly one argument axis may be specified.
Rotating a scalar always yields that scalar unchanged. Otherwise, Rotate operates on a particular axis of its right argument. This axis is the specified axis if one is given, and otherwise the last axis for <source lang=apl inline>⌽</syntaxhighlight>, or the first axis for <source lang=apl inline>⊖</syntaxhighlight>.
The result array has the same shape and elements as the right argument array, but the elements cyclically move around the rotation axis. Consequently if the length of this axis is 0 or 1 then rotation has no effect.
APL model
The rotation of a vector <source lang=apl inline>Y</syntaxhighlight> by <source lang=apl inline>X</syntaxhighlight> units may be written in any APL, assuming <source lang=apl inline>⎕IO←0</syntaxhighlight>, as <source lang=apl inline>Y[(⍴Y)|X+⍳⍴Y]</syntaxhighlight>. To rotate an arbitrary array Squad indexing with axis (or rank) is helpful. <source lang=apl> RotateAxis ← { ⍝ R ← X (K RotateAxis) Y
⎕IO←0 0=≢⍴⍵: ⍵ ⍝ Return a scalar unchanged l ← ⍺⍺ ⌷ ⍴⍵ ⍝ Length of rotation axis (⊂l|⍺+⍳l) ⌷[⍺⍺] ⍵ ⍝ Rotate with indexing
} </syntaxhighlight>
External links
Lessons
Documentation
- Dyalog
- APLX
- J Dictionary, NuVoc (only first-axis rotate exists)
- BQN