Depth (operator)

From APL Wiki
Revision as of 22:05, 10 September 2022 by Adám Brudzewsky (talk | contribs) (Text replacement - "<source" to "<syntaxhighlight")
Jump to navigation Jump to search
This article is about the operator. See Depth for the number associated with every array and the function which returns this number.

Depth () is a primitive dyadic operator which applies its left operand function to sub-elements of its arguments specified by its right operand array. It appears in Extended Dyalog APL, dzaima/APL, J (as <syntaxhighlight lang=j inline>L:</source>), and BQN (as ).

Introduction

The Depth operator is a generalisation of the Each operator (as ¨). While Each switches application from being directly on array arguments, to be on their elements, Depth allows exact specification of the depth level of each argument that the function is applied to.

Depth is closely related to Rank (<syntaxhighlight lang=apl inline>⍤</source>), but while Rank specifies the rank of the final arguments of theleft operand function, Depth specifies the depth of the final arguments of the left operand function.

For all arguments, when applied with a non-negative right depth specification (the right operand), and also with negative depth specification even when the arguments are ragged (of non-uniform depth), <syntaxhighlight lang=apl inline>f⍥p⊢Y</source> is equivalent to <syntaxhighlight lang=apl inline>f¨¨</source>…<syntaxhighlight lang=apl inline>¨¨Y</source> and <syntaxhighlight lang=apl inline>X f⍥p⊢Y</source> is equivalent to <syntaxhighlight lang=apl inline>(⊂⊂</source>…<syntaxhighlight lang=apl inline>⊂⊂X)f¨¨</source>…<syntaxhighlight lang=apl inline>¨¨⊂⊂</source>…<syntaxhighlight lang=apl inline>⊂⊂Y</source> where "xxxx" indicates some number of repetitions of the function or operator x.

Depth specification

The right operand specifies the depth of sub-elements to which the left operand function is applied as follows: For left argument <syntaxhighlight lang=apl inline>⍺</source> and right argument <syntaxhighlight lang=apl inline>⍵</source>, <syntaxhighlight lang=apl>

  ⍤    c   ⍝ Depth-c cells of ⍵ (monadic) or both arguments (dyadic)
  ⍤  b c   ⍝ Depth-b cells of ⍺ and depth-c sub-elements of ⍵ (dyadic)
  ⍤a b c   ⍝ Depth-a cells of ⍵ (monadic), depth-b sub-elements of ⍺ and depth-c sub-elements of ⍵ (dyadic)

</source>

A non-negative right operand specifies the depth of the final arguments to which the function applies. Therefore, application with a depth specification of <syntaxhighlight lang=apl inline>0</source> causes the function to be called only on simple scalars, thus implementing pervasion for any given function.

A negative right operand specifies complementary depth, i.e. the number of levels to descend into before applying the operand. Negative depth can also be thought of as depth specification relative to the overall depth of the argument array. Thus, a depth specification of <syntaxhighlight lang=apl inline>¯1</source> is equivalent to application with Each and in general, a depth specification of <syntaxhighlight lang=apl inline>-k</source> is equivalent to application with <syntaxhighlight lang=apl inline>k</source> Eaches.

Since a depth specification greater than the depth of the argument array means to apply the function to the whole array, <syntaxhighlight lang=apl inline>(⌊/⍬)</source> or <syntaxhighlight lang=apl inline>∞</source>, depending on the implementation, is "depth infinity" and always specifies the whole argument array. However, in practice, any large number, for example 9, is sufficient for most uses.

Examples

Reverse each element in a ragged depth-3D array (note that all member vectors are reversed, despite that their individual structures vary): <syntaxhighlight lang=apl>

     ⌽⍥¯1⊢('abc' 'cdef') 'ghi'  ⍝ equivalent to ⌽¨('abc' 'cdef') 'ghi'

┌──────────┬───┐ │┌────┬───┐│ihg│ ││cdef│abc││ │ │└────┴───┘│ │ └──────────┴───┘ </source> Reverse each simple vector in a ragged depth-3D array (note that each simple vector is reversed, even though the amount of penetration, into the entire array, varies): <syntaxhighlight lang=apl>

     ⌽⍥1⊢('abc' 'cdef') 'ghi'

┌──────────┬───┐ │┌───┬────┐│ihg│ ││cba│fedc││ │ │└───┴────┘│ │ └──────────┴───┘ </source>


Concatenate a constant prefix to each element: <syntaxhighlight lang=apl>

       '; ',⍥1⊢'abc' 'cdef' 'ghi'  ⍝ equivalent to (⊂'; '),¨'abc' 'cdef' 'ghi'

┌─────┬──────┬─────┐ │; abc│; cdef│; ghi│ └─────┴──────┴─────┘ </source>

Pair up the elements on the left with each element of each element on the right. <syntaxhighlight lang=apl>

     'xy',⍥0 1⊢('ab' 'cd')('AB' 'CD')  ⍝ equivalent to (⊂'xy'),¨¨('ab' 'cd')('AB' 'CD')

┌─────────┬─────────┐ │┌───┬───┐│┌───┬───┐│ ││xab│ycd│││xAB│yCD││ │└───┴───┘│└───┴───┘│ └─────────┴─────────┘ </source>

External links

Documentation

Publications


APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare RootRound
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axisIdentity (Null, Ident)
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)Identity (Lev, Dex)
Quad names Index originComparison toleranceMigration levelAtomic vector