2,951
edits
Miraheze>Adám Brudzewsky No edit summary |
(→Documentation: BQN link) |
||
(12 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{Built-in|Drop|↓}} is a [[primitive function]] which removes part of each [[axis]] of an array. The removed portions are exactly those that [[Take]] would include in its result. Drop is subject to the same extensions as [[Take]], and a detailed description of those extensions and their history is given in that article rather than this one. Unlike Take, Drop never uses [[fill elements]] and the result is always a [[subarray]] of the argument. | ||
== Examples == | == Examples == | ||
Use Drop to remove leading or trailing [[elements]] from a [[vector]]: | Use Drop to remove leading or trailing [[elements]] from a [[vector]]: | ||
<source | <source lang=apl> | ||
3 ↓ 5 4 3 2 1 | 3 ↓ 5 4 3 2 1 | ||
2 1 | 2 1 | ||
Line 12: | Line 12: | ||
Removing more elements than the length of the axis gives an [[empty]] result: | Removing more elements than the length of the axis gives an [[empty]] result: | ||
<source | <source lang=apl> | ||
¯8 ↓ 5 4 3 2 1 | ¯8 ↓ 5 4 3 2 1 | ||
Line 19: | Line 19: | ||
When the right argument is a multidimensional array, one element from the left argument is used for each axis. In a language that supports [[axis specification]] for Take, or allows a short left argument, you can specify drop amounts for only some axes: other axes will remain unchanged. | When the right argument is a multidimensional array, one element from the left argument is used for each axis. In a language that supports [[axis specification]] for Take, or allows a short left argument, you can specify drop amounts for only some axes: other axes will remain unchanged. | ||
<source | <source lang=apl> | ||
2 3 ↓ ⍳4 5 | 2 3 ↓ ⍳4 5 | ||
┌───┬───┐ | ┌───┬───┐ | ||
Line 32: | Line 32: | ||
The arguments to Drop must be valid arguments to [[Take]], and elements of the left argument are matched to [[axes]] of the right in the same way. Like Take, the left argument is subject to [[scalar rank extension]], and in some APLs the right is as well. | The arguments to Drop must be valid arguments to [[Take]], and elements of the left argument are matched to [[axes]] of the right in the same way. Like Take, the left argument is subject to [[scalar rank extension]], and in some APLs the right is as well. | ||
Each axis with a matching left argument element < | Each axis with a matching left argument element <source lang=apl inline>d</source> is modified to remove <source lang=apl inline>|d</source> indices, or all of them if <source lang=apl inline>|d</source> is larger than the length of the axis. Indices are removed starting from the beginning if <source lang=apl inline>d</source> is positive and starting from the end if it is negative (if <source lang=apl inline>d</source> is 0, then no indices are removed). Equivalently, for an axis of length <source lang=apl inline>l</source>, <source lang=apl inline>l-l⌊|d</source> axes are retained—not dropped—from the axis starting from the opposite side: the end if <source lang=apl inline>d</source> is positive and the beginning otherwise. If <source lang=apl inline>|d</source> is greater than or equal to <source lang=apl inline>l</source> for any axis, then the result is [[empty array|empty]] and shares a [[prototype]] with the argument. | ||
=== APL Model === | === APL Model === | ||
Drop can be modelled using Take with a complementary length: | Drop can be modelled using Take with a complementary length: | ||
<source | <source lang=apl> | ||
Drop ← { | Drop ← { | ||
s ← ⍴⍵ | s ← ⍴⍵ | ||
Line 45: | Line 45: | ||
} | } | ||
</source> | </source> | ||
The code works by modifying the left argument using the right argument's shape. First, the shape is used to restrict the left argument's range (< | The code works by modifying the left argument using the right argument's shape. First, the shape is used to restrict the left argument's range (<source lang=apl inline>(-s)⌈s⌊⍺</source>) so that the maximum number of indices dropped is the length of the axis. Then, the shape is added or subtracted so that the left argument's sign is flipped. | ||
This implementation inherits all argument extensions from Take. The two middle lines are used to support right argument scalar rank extension and the [[SHARP APL]] short left argument extension. If Take does not have these extensions then they have no effect and can be removed. | This implementation inherits all argument extensions from Take. The two middle lines are used to support right argument scalar rank extension and the [[SHARP APL]] short left argument extension. If Take does not have these extensions then they have no effect and can be removed. | ||
== | == External links == | ||
=== Lessons === | |||
* [https://chat.stackexchange.com/rooms/52405/conversation/lesson-6-apl-functions-----#message-41304578 APL Cultivation] | |||
=== Documentation === | |||
* [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Drop.htm Dyalog] ([https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Drop%20with%20Axes.htm with axis]) | |||
* [http://microapl.com/apl_help/ch_020_020_570.htm APLX] | |||
* [https://www.jsoftware.com/help/dictionary/d531.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/curlyrtdot#dyadic J NuVoc] (as <source lang=apl inline>}.</source>) | |||
* [https://mlochbaum.github.io/BQN/doc/take.html BQN] | |||
{{APL built-ins}}[[Category:Primitive functions]] |