Indices: Difference between revisions
m (20 revisions imported: Migrate from miraheze) |
No edit summary |
||
Line 1: | Line 1: | ||
:''This page describes a primitive whose result is a list of indices. See [[Index]] for the page on indices themselves. See [[Index of]] for the index generator.'' | :''This page describes a primitive whose result is a list of indices. See [[Index]] for the page on indices themselves. See [[Index of]] for the index generator.'' | ||
{{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. | {{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. | ||
Where on a Boolean argument was introduced in [[K]] as <source lang=k inline>&</source>, and it was extended to non-negative integers in [[J]], with the name Indices (<source lang=j inline>I.</source>). | |||
== Examples == | == Examples == | ||
Line 51: | Line 51: | ||
Indices may be viewed as a way to convert between two ways of writing [[wikipedia:multiset|multiset]]s of array [[Index|indices]]. The argument uses a dense representation indicating for each index the number of times it appears, and the result uses a sparse representation which lists all the indices contained in the set. | Indices may be viewed as a way to convert between two ways of writing [[wikipedia:multiset|multiset]]s of array [[Index|indices]]. The argument uses a dense representation indicating for each index the number of times it appears, and the result uses a sparse representation which lists all the indices contained in the set. | ||
== History == | |||
[[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 1998.<ref>Kx Systems. [http://web.archive.org/web/20041022042401/http://www.kx.com/technical/documents/kusrlite.pdf "K User Manual"]. 1998.</ref> It was extended to vectors of non-negative integers when it was added to [[J]] as Indices (<source lang=j inline>I.</source>) in release 5.02 (2003).<ref>Jsoftware. [https://www.jsoftware.com/docs/archive/release/ifb.htm "I. Implements ''Indices'']. 2003.</ref> | |||
Indices (<source lang=j inline>⍸</source>) was first introduced to APL, and the [[nested array model]], by [[NARS2000]]. Originally defined only for vectors, the current definition <source lang=apl inline>(,R)/,⍳⍴1/R</source> was introduced in about 2013 after some experimentation with other definitions.<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=j inline>⍸</source>) with the same definition was added to [[Dyalog APL 16.0]] with the restriction that the argument be Boolean, and this restriction was lifted to allow non-negative integers in [[Dyalog APL 18.0]]. | |||
== Documentation == | == Documentation == | ||
Line 63: | Line 71: | ||
[https://chat.stackexchange.com/transcript/52405?m=41724812#41724812 APL Cultivation] | [https://chat.stackexchange.com/transcript/52405?m=41724812#41724812 APL Cultivation] | ||
== References == | |||
<references /> | |||
{{APL built-ins}} | {{APL built-ins}} |
Revision as of 03:08, 6 December 2019
- This page describes a primitive whose result is a list of indices. See Index for the page on indices themselves. See Index of for the index generator.
⍸
|
Indices (⍸
), or Where, is a monadic primitive function which returns the 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.
Where on a Boolean argument was introduced in K as &
, and it was extended to non-negative integers in J, with the name Indices (I.
).
Examples
In all implementations, Indices gives the indices of ones in a Boolean vector.
⍸ 0 0 1 0 0 0 1 0 3 7
In nested APLs it returns nested indices when passed a matrix or higher-dimensional array.
⍸ 3 3⍴0 0 1 0 0 0 1 0 ┌───┬───┐ │1 3│3 1│ └───┴───┘ ⍸ 1 ⍝ An index into a scalar is empty! ┌┐ ││ └┘
If numbers higher than 1 are allowed, they indicate that the index of the number is repeated. Negative numbers are never allowed.
⍸ 3 0 2 1 1 1 3 3
Description and APL model
Indices replicates each index in the argument by the number of times it appears. It is identical to the APL function:
Where ← {(,⍵)⌿,⍳⍴⍵}
The argument is restricted to be an array of non-negative integers, or, in Dyalog APL, Booleans.
Because Indices returns indices (like Iota), it is subject to index origin.
The only flat array language which implements Indices is J. Because J's Iota does not return multidimensional indices, J defines Indices to have function rank 1 so that only vector indices are used.
Mathematical interpretation
Indices may be viewed as a way to convert between two ways of writing multisets of array indices. The argument uses a dense representation indicating for each index the number of times it appears, and the result uses a sparse representation which lists all the indices contained in the set.
History
Idioms 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 X/⍳⍴X
as "594. Indices of ones in logical vector X".
Where (&
) with a Boolean argument was present in K by K2 in 1998.[1] It was extended to vectors of non-negative integers when it was added to J as Indices (I.
) in release 5.02 (2003).[2]
Indices (⍸
) was first introduced to APL, and the nested array model, by NARS2000. Originally defined only for vectors, the current definition (,R)/,⍳⍴1/R
was introduced in about 2013 after some experimentation with other definitions.[3] Where (⍸
) with the same definition was added to Dyalog APL 16.0 with the restriction that the argument be Boolean, and this restriction was lifted to allow non-negative integers in Dyalog APL 18.0.
Documentation
J Dictionary, NuVoc
Other resources
References
- ↑ Kx Systems. "K User Manual". 1998.
- ↑ Jsoftware. "I. Implements Indices. 2003.
- ↑ NARS2000 Wiki. Indices. Old revision: 2013-05-26.