Take: Difference between revisions

Jump to navigation Jump to search
3,658 bytes removed ,  07:36, 23 October 2019
m
Reverted edits by Marshall (talk) to last revision by Adám Brudzewsky
Miraheze>Marshall
Miraheze>Marshall
m (Reverted edits by Marshall (talk) to last revision by Adám Brudzewsky)
Line 12: Line 12:
The left argument to length specifies a length, and not an index. It does not depend on [[index origin]].
The left argument to length specifies a length, and not an index. It does not depend on [[index origin]].


A length which is larger than the argument length causes [[Fill element|fills]] to be inserted. The alignment remains the same: if two different positive arguments are used to take from an array, the one which is closer to zero gives a [[prefix]] of the other result. If they are both negative, it is a [[suffix]] instead. When Take makes an axis longer, it is said to "overtake" along that axis.
A length which is larger than the argument length causes [[Fill element|fills]] to be inserted. The alignment remains the same: if two different positive arguments are used to take from an array, the one which is closer to zero gives a [[prefix]] of the other result. If they are both negative, it is a [[suffix]] instead.
<source lang=apl>
<source lang=apl>
       8 ↑ 5 4 3 2 1
       8 ↑ 5 4 3 2 1
Line 19: Line 19:
0 0 0 5 4 3 2 1
0 0 0 5 4 3 2 1
</source>
</source>
{{Works in|[[Dyalog APL]], [[ngn/apl]]}}
{{Works in|[[Dyalog APL]], [[ngn/APL]]}}


A higher-[[rank]] array can be shortened by using a left argument with one element for each axis:
A higher-[[rank]] array can be shortened by using a left argument with one element for each axis:
Line 30: Line 30:
└───┴───┴───┘
└───┴───┴───┘
</source>
</source>
{{Works in|[[Dyalog APL]], [[dzaima/APL]], [[ngn/apl]]}}
{{Works in|[[Dyalog APL]], [[dzaima/APL]], [[ngn/APL]]}}


In languages with the SHARP APL extension, the left argument can be shortened. This causes leading axes of the right argument to be modified while trailing axes are ignored.
In languages with the SHARP APL extension, the left argument can be shortened. This causes leading axes of the right argument to be modified while trailing axes are ignored.
Line 41: Line 41:
└───┴───┴───┴───┴───┘
└───┴───┴───┴───┴───┘
</source>
</source>
{{Works in|[[Dyalog APL]], [[ngn/apl]]}}
{{Works in|[[Dyalog APL]], [[ngn/APL]]}}


An [[Function axis|axis]] may be specified to apply left argument elements to specific axes of the right argument. Here the last axis is specified in order to take two columns of the argument.
An [[Function axis|axis]] may be specified to apply left argument elements to specific axes of the right argument. Here the last axis is specified in order to take two columns of the argument.
Line 72: Line 72:


When Take is called with [[Function axis|axis]], the axis determines how elements of the left argument correspond to axes of the right argument. The left argument and axis are required to have rank no more than 1 and are treated as vectors. Their lengths must match, and be less than or equal to the rank of the right argument. Then each element of the left argument applies to the right argument axis given by the corresponding element of the axis vector. Each axis may only be specified once, and unspecified axes are left unchanged.
When Take is called with [[Function axis|axis]], the axis determines how elements of the left argument correspond to axes of the right argument. The left argument and axis are required to have rank no more than 1 and are treated as vectors. Their lengths must match, and be less than or equal to the rank of the right argument. Then each element of the left argument applies to the right argument axis given by the corresponding element of the axis vector. Each axis may only be specified once, and unspecified axes are left unchanged.
=== APL model ===
The following [[dfn]] models Take as defined by [[Dyalog APL]] but with no axis specification or error checking. It is implemented by construction a [[nested array]] of indices and using these to select from the right argument, with prototypes used for out-of-range indices. It explicitly includes [[scalar rank extension]] for the right argument and the SHARP APL extension; if these extensions are not wanted those lines can be removed. [[Scalar rank extension]] of the left argument is inherited from [[Iota]] and [[scalar function]] extension.
<source class=apl>
Take ← {
  ⎕IO←0                        ⍝ For index comparisons
  r s ← ≢¨(⍴⍵)(⍺)              ⍝ Rank and number of modified axes
  (r=0)∧s>0: ⍺∇(s⍴1)⍴⍵          ⍝ Right argument scalar rank extension
  s<r: (⍺,(s-r)∇⍴⍵)∇⍵          ⍝ SHARP APL extension
  inds ← ((⍺<0)×⍺+⍴⍵)∘+¨ ⍳|⍺    ⍝ Indices to select
  sel ← {
    ∧/(0≤⍺)∧⍺<⍴⍵: (⊂⍺)⊃⍵        ⍝ In range: use Pick
    ⊃0⍴⍵                        ⍝ Otherwise, get prototype
  }
  sel∘⍵¨ inds
}
</source>
{{Works in|[[Dyalog APL]]}}
This definition could be converted to work in a [[Flat array model|flat]] APL with the [[Rank operator]] by using an [[odometer function]] like <code>⊢⊤(⍳×/)</code> in place of [[Iota]] and changing the two subsequent uses of [[Each]] to Rank 1.


== History ==
== History ==


In [[A Programming Language]], prefix and suffix operations were described using the syntax <code>⍺<sup>j</sup>/x</code> to take the first <code>j</code> elements of vector <code>x</code> and <code>⍵<sup>j</sup>/x</code> for the last <code>j</code> elements. This combined a use of the special prefix and suffix vectors <code>⍺<sup>j</sup>(n)</code> and <code>⍵<sup>j</sup>(n)</code> with [[Compress|compression]], with the length <code>n</code> inferred based on the length of <code>x</code>. The symbol <code>↑</code> was used for vector [[Rotate]], while <code>↓</code> rotated in the opposite direction.<ref>Iverson, K.E. (1962). A Programming Language. Wiley. ISBN 978-0-471-43014-8.</ref>
Take was present in [[APL\360]], but not in [[A Programming Language]], where the symbol (<code>↑</code>) was used for [[Rotate]].<ref>Iverson, Kenneth E. (1962). A Programming Language. Wiley. ISBN 978-0-471-43014-8.</ref>
 
Take using the symbol <code>↑</code> was absent from the first version of [[APL\360]]<ref>Falkoff, A.D., and K.E. Iverson. [https://www.jsoftware.com/papers/APL360TerminalSystem.htm "The APL\360 Terminal System"]. Research Report RC-1922, IBM, 1967-10-16.</ref> but was introduced by 1968<ref>Falkoff, A.D., and K.E. Iverson, "[http://keiapl.org/archive/APL360_UsersMan_Aug1968.pdf APL\360 User's Manual]". IBM, August 1968.</ref>.


The [[Function axis|axis]] specification for Take was defined in [[APL2]]. It is shared by [[SHARP APL]] and [[Rationalized APL]], and continues to be supported in [[Dyalog APL]].
The [[Function axis|axis]] specification for Take was defined in [[APL2]]. It is shared by [[SHARP APL]] and [[Rationalized APL]], and continues to be supported in [[Dyalog APL]].


[[SHARP APL 19.0]], released in 1987, extended Take to allow short left arguments. The choice to align left argument elements with the leading axes of the right argument was made according to the nascent [[leading axis theory]]: while a user may not have any preference for manipulating the earlier dimensions, this choice makes Take more flexible when used with the [[Rank operator]].<ref>Bernecky, Robert. [https://dl.acm.org/citation.cfm?id=55632 "An Introduction to Function Rank"]. APL88 Conference Proceedings. ''ACM SIGAPL Quote Quad'', 18(2), December 1987.</ref> This extension is also used in [[Dyalog APL]], [[J]], and [[ngn/apl]]. It was not adopted in [[ISO/IEC 13751:2001]].
[[SHARP APL 19.0]], released in 1987, extended Take to allow short left arguments. The choice to align left argument elements with the leading axes of the right argument was made according to the nascent [[leading axis theory]]: while a user may not have any preference for manipulating the earlier dimensions, this choice makes Take more flexible when used with the [[Rank operator]].<ref>Bernecky, Robert. [https://dl.acm.org/citation.cfm?id=55632 "An Introduction to Function Rank"]. APL88 Conference Proceedings. ''ACM SIGAPL Quote Quad'', 18(2), December 1987.</ref> This extension is also used in [[Dyalog APL]], [[J]], and [[ngn/APL]]. It was not adopted in [[ISO/IEC 13751:2001]].
 
== Extension support ==
 
{| class=wikitable
! Language                !! Scalar right arg !! Short left arg !! Axis specification
|-
| [[APL\360]]            || N                || N              || N
|-
| [[APL2]]                || Y                || N              || Y
|-
| [[SHARP APL]]          || Y                || Y              || Y
|-
| [[Dyalog APL]]          || Y                || Y              || Y
|-
| [[J]] (<code>{.</code>) || Y                || Y              || N
|-
| [[GNU APL]]            || Y                || N              || Y
|-
| [[ngn/apl]]            || Y                || Y              || N
|-
| [[dzaima/APL]]          || N                || Y              || N
|}
 
== Documentation ==
 
[http://help.dyalog.com/latest/Content/Language/Primitive%20Functions/Take.htm Dyalog] [http://help.dyalog.com/latest/Content/Language/Primitive%20Functions/Take%20with%20Axes.htm with axis]
 
[http://wiki.nars2000.org/index.php/Symbol_Take NARS2000]
 
J [https://www.jsoftware.com/help/dictionary/d521.htm dictionary], [https://code.jsoftware.com/wiki/Vocabulary/curlylfdot#dyadic NuVoc]
 
== Other resources ==
 
[https://chat.stackexchange.com/transcript/52405?m=41304361#41304361 APL Cultivation]


== References ==
== References ==


<references />
<references />
Anonymous user

Navigation menu