Indices: Difference between revisions

Jump to navigation Jump to search
72 bytes removed ,  14:38, 16 March 2020
no edit summary
(Add Replicate to introduction)
No edit summary
Line 3: Line 3:
{{Built-in|Indices|⍸}}, or '''Where''', is a [[monadic]] [[primitive function]] which returns the [[Index|indices]] of all ones in a [[Boolean]] array. More generally, Indices accepts an array of non-negative integers and copies each index the corresponding number of times. It is closely related to [[Replicate]], and may be seen as an index-based equivalent to Replicate in the same way that [[Grade]] is an index-based equivalent of sorting.
{{Built-in|Indices|⍸}}, or '''Where''', is a [[monadic]] [[primitive function]] which returns the [[Index|indices]] of all ones in a [[Boolean]] array. More generally, Indices accepts an array of non-negative integers and copies each index the corresponding number of times. It is closely related to [[Replicate]], and may be seen as an index-based equivalent to Replicate in the same way that [[Grade]] is an index-based equivalent of sorting.


In [[K]], the first language to include the primitive, it is called Where (<source lang=k inline>&</source>). In [[J]], it is called Indices (<source lang=j inline>I.</source>).
In [[K]], the first language to include the primitive, it is called Where (<code>&</code>). In [[J]], it is called Indices (<source lang=j inline>I.</source>).


== Examples ==
== Examples ==
Line 56: Line 56:
Indices on a [[vector]] is closely related to [[Replicate]]: for vectors <source lang=apl inline>V</source> and <source lang=apl inline>W</source>, we have <source lang=apl inline>⍸V</source> {{←→}} <source lang=apl inline>V/⍳≢V</source> and <source lang=apl inline>V⌿X</source> {{←→}} <source lang=apl inline>X[⍸V]</source>. While Replicate performs a transformation on another array, Indices gives a representation of that transformation using [[Index|indices]]. The relationship between Indices and Replicate parallels that between [[Grade]] and [[Sort By]].
Indices on a [[vector]] is closely related to [[Replicate]]: for vectors <source lang=apl inline>V</source> and <source lang=apl inline>W</source>, we have <source lang=apl inline>⍸V</source> {{←→}} <source lang=apl inline>V/⍳≢V</source> and <source lang=apl inline>V⌿X</source> {{←→}} <source lang=apl inline>X[⍸V]</source>. While Replicate performs a transformation on another array, Indices gives a representation of that transformation using [[Index|indices]]. The relationship between Indices and Replicate parallels that between [[Grade]] and [[Sort By]].


[[K]] takes advantage of this relationship by removing the primitive Replicate entirely: the glyph <source lang=k inline>&</source> is paired with [[Minimum]] instead. In K, Replicate is performed by using Where and then [[indexing]].
[[K]] takes advantage of this relationship by removing the primitive Replicate entirely: the glyph <code>&</code> is paired with [[Minimum]] instead. In K, Replicate is performed by using Where and then [[indexing]].


== History ==
== History ==
Line 62: Line 62:
[[Idiom]]s with similar behavior to Indices were widely used in APL long before it was made into a primitive. For example, the [[FinnAPL idiom library]], first presented in 1984, lists <source lang=apl inline>X/⍳⍴X</source> as "594. Indices of ones in logical vector X".
[[Idiom]]s with similar behavior to Indices were widely used in APL long before it was made into a primitive. For example, the [[FinnAPL idiom library]], first presented in 1984, lists <source lang=apl inline>X/⍳⍴X</source> as "594. Indices of ones in logical vector X".


Where (<source lang=k inline>&</source>) with a Boolean argument was present in [[K]] by K2 in 1996,<ref>Kx Systems. [http://web.archive.org/web/20041022042401/http://www.kx.com/technical/documents/kusrlite.pdf "K User Manual"]. 1998.</ref> and extended to non-negative integers by K4 in 2000. It was added to [[J]] for the domain of non-negative integer vectors as Indices (<source lang=j inline>I.</source>) in release 5.02 (2003), introducing the pairing of Indices and [[Interval Index]] now used in APL.<ref>Jsoftware. [https://www.jsoftware.com/docs/archive/release/ifb.htm "I. Implements ''Indices'']. 2003.</ref>
Where (<code>&</code>) with a Boolean argument was present in [[K]] by K2 in 1996,<ref>Kx Systems. [http://web.archive.org/web/20041022042401/http://www.kx.com/technical/documents/kusrlite.pdf "K User Manual"]. 1998.</ref> and extended to non-negative integers by K4 in 2000. It was added to [[J]] for the domain of non-negative integer vectors as Indices (<source lang=j inline>I.</source>) in release 5.02 (2003), introducing the pairing of Indices and [[Interval Index]] now used in APL.<ref>Jsoftware. [https://www.jsoftware.com/docs/archive/release/ifb.htm "I. Implements ''Indices'']. 2003.</ref>


Indices (<source lang=apl inline>⍸</source>) was first introduced to APL, and the [[nested array model]], by [[NARS2000]]. Originally defined only for vectors, the generalised definition <source lang=apl inline>(,R)/,⍳⍴1/R</source> was introduced in about 2013 after some experimentation with alternatives.<ref>NARS2000 Wiki. [http://wiki.nars2000.org/index.php?title=Indices&direction=next&oldid=863 Indices]. Old revision: 2013-05-26.</ref> Where (<source lang=apl inline>⍸</source>) was added to [[Dyalog APL 16.0]] (June 2017), with the nearly-identical definition <source lang=apl inline>{(,⍵)⌿,⍳⍴⍵}</source>, but also with the restriction that the argument be Boolean. This restriction that was lifted to allow non-negative integers in [[Dyalog APL 18.0|18.0]] (2020). For a [[scalar]] <source lang=apl inline>I</source>, Dyalog's definition gives <source lang=apl inline>I⍴⊂⍬</source> for <source lang=apl inline>⍸I</source>, while NARS2000 returned <source lang=apl inline>I⍴1</source>. By January 2018, NARS2000 switched to Dyalog's definition, removing the discrepancy for scalar arguments.
Indices (<source lang=apl inline>⍸</source>) was first introduced to APL, and the [[nested array model]], by [[NARS2000]]. Originally defined only for vectors, the generalised definition <source lang=apl inline>(,R)/,⍳⍴1/R</source> was introduced in about 2013 after some experimentation with alternatives.<ref>NARS2000 Wiki. [http://wiki.nars2000.org/index.php?title=Indices&direction=next&oldid=863 Indices]. Old revision: 2013-05-26.</ref> Where (<source lang=apl inline>⍸</source>) was added to [[Dyalog APL 16.0]] (June 2017), with the nearly-identical definition <source lang=apl inline>{(,⍵)⌿,⍳⍴⍵}</source>, but also with the restriction that the argument be Boolean. This restriction that was lifted to allow non-negative integers in [[Dyalog APL 18.0|18.0]] (2020). For a [[scalar]] <source lang=apl inline>I</source>, Dyalog's definition gives <source lang=apl inline>I⍴⊂⍬</source> for <source lang=apl inline>⍸I</source>, while NARS2000 returned <source lang=apl inline>I⍴1</source>. By January 2018, NARS2000 switched to Dyalog's definition, removing the discrepancy for scalar arguments.
Line 77: Line 77:
* [http://wiki.nars2000.org/index.php/Indices NARS2000]
* [http://wiki.nars2000.org/index.php/Indices NARS2000]
* J [https://www.jsoftware.com/help/dictionary/dicapdot.htm Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/icapdot NuVoc] (as <source lang=j inline>I.</source>)
* J [https://www.jsoftware.com/help/dictionary/dicapdot.htm Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/icapdot NuVoc] (as <source lang=j inline>I.</source>)
* [https://github.com/kevinlawler/kona/wiki/Where Kona (K3)] (as <source lang=k inline>&</source>)
* [https://github.com/kevinlawler/kona/wiki/Where Kona (K3)] (as <code>&</code>)


== References ==
== References ==

Navigation menu