Raze: Difference between revisions

Jump to navigation Jump to search
331 bytes added ,  22:05, 10 September 2022
m
Text replacement - "<source" to "<syntaxhighlight"
(link to symbol page)
m (Text replacement - "<source" to "<syntaxhighlight")
Tags: Mobile edit Mobile web edit
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
:''The [[Right Shoe]] symbol <source lang=apl inline>⊃</source> is more commonly used for [[First]] or [[Mix]].''
:''The [[Right Shoe]] symbol <syntaxhighlight lang=apl inline>⊃</syntaxhighlight> is more commonly used for [[First]] or [[Mix]].''


{{Built-in|Raze|⊃}}, <source lang=j inline>;</source> in [[J]], or '''Join''' (<source inline>∾</source>) in [[BQN]], is a [[monadic function]] which combines [[element]] arrays of a [[nested]] [[vector]] along the first [[axis]] (in accordance with [[leading axis theory]]). Thus, the [[major cell]]s of the Raze of an array are the major cells of its element arrays: unlike [[Mix]], which removes a level of [[depth]] while keeping outer and inner axes separate, Raze merges the outer vector's axis with the first axis of each element. Raze is present in [[A+]], [[J]], and [[BQN]].
{{Built-in|Raze|⊃}}, <syntaxhighlight lang=j inline>;</syntaxhighlight> in [[J]], or '''Join''' (<code>∾</code>) in [[BQN]], is a [[monadic function]] which combines [[element]] arrays of a [[nested]] [[vector]] along the first [[axis]] (in accordance with [[leading axis theory]]). Thus, the [[major cell]]s of the Raze of an array are the major cells of its element arrays: unlike [[Mix]], which removes a level of [[depth]] while keeping outer and inner axes separate, Raze merges the outer vector's axis with the first axis of each element. Raze is present in [[A+]], [[J]], and [[BQN]].


== Examples ==
== Examples ==


Raze can turn a vector of vectors into a single vector. Unlike [[Mix]], it inserts no [[fill element]]s.
Raze can turn a vector of vectors into a single vector. Unlike [[Mix]], it inserts no [[fill element]]s.
<source lang=apl>
<syntaxhighlight lang=apl>
       ⊃(2 3 4;0 1;5)
       ⊃(2 3 4;0 1;5)
2 3 4 0 1 5
2 3 4 0 1 5
</source>
</syntaxhighlight>
{{Works in|[[A+]]}}
{{Works in|[[A+]]}}
When elements of the argument have rank more than 1, Raze combines them along the leading axis, like [[Catenate First]]. In A+, the elements must have the same rank and major cell shape or an error results; in J, lower-rank arrays are promoted to a higher rank and arrays are padded with fills to a common major cell shape.
When elements of the argument have rank more than 1, Raze combines them along the leading axis, like [[Catenate First]]. In A+, the elements must have the same rank and major cell shape or an error results; in J, lower-rank arrays are promoted to a higher rank and arrays are padded with fills to a common major cell shape.
<source lang=apl>
<syntaxhighlight lang=apl>
       ⊃(⍳2 2;-⍳4 2)
       ⊃(⍳2 2;-⍳4 2)
  0  1
  0  1
Line 20: Line 20:
¯4 ¯5
¯4 ¯5
¯6 ¯7
¯6 ¯7
</source>
</syntaxhighlight>
{{Works in|[[A+]]}}
{{Works in|[[A+]]}}


== Properties ==
== Properties ==


Raze is similar to the [[Catenate]] [[reduction]] <source lang=apl inline>↑⍪/</source>. If <source lang=apl inline>X</source> is a vector whose elements have equal and positive [[rank]], then <source lang=apl inline>↑⍪/X</source> is the Raze of <source lang=apl inline>X</source>. The definition differs if <source lang=apl inline>X</source> is a [[singleton]] vector with [[scalar]] elements, because the Raze of <source lang=apl inline>X</source> will be a vector while the reduction implementation results in a scalar (or, in [[NARS2000]], a [[DOMAIN ERROR]]). This is because Raze treats scalar elements of its argument as singleton vectors, a convention which may be viewed as [[scalar rank extension]] or as a result of the idea that a scalar's only [[major cell]] is itself.
Raze is similar to the [[Catenate]] [[reduction]] <syntaxhighlight lang=apl inline>↑⍪/</syntaxhighlight>. If <syntaxhighlight lang=apl inline>X</syntaxhighlight> is a vector whose elements have equal and positive [[rank]], then <syntaxhighlight lang=apl inline>↑⍪/X</syntaxhighlight> is the Raze of <syntaxhighlight lang=apl inline>X</syntaxhighlight>. The definition differs if <syntaxhighlight lang=apl inline>X</syntaxhighlight> is a [[singleton]] vector with [[scalar]] elements, because the Raze of <syntaxhighlight lang=apl inline>X</syntaxhighlight> will be a vector while the reduction implementation results in a scalar (or, in [[NARS2000]], a [[DOMAIN ERROR]]). This is because Raze treats scalar elements of its argument as singleton vectors, a convention which may be viewed as [[scalar rank extension]] or as a result of the idea that a scalar's only [[major cell]] is itself.


Raze is the [[inverse]] of [[Partition]] and [[Partitioned Enclose]] on vectors: partitioning, then razing, a vector gives that vector back. It is also an inverse to partition functions which partition major cells along the first axis, although few partition functions do this.
Raze is the [[inverse]] of [[Partition]] and [[Partitioned Enclose]] on vectors: partitioning, then razing, a vector gives that vector back. It is also an inverse to partition functions which partition major cells along the first axis, although few partition functions do this.
Line 33: Line 33:
Raze can be extended to an argument array of rank greater than 1, allowing it to merge [[wikipedia:Block matrix|block matrices]] or higher-dimensional structures. This extension is part of [[BQN]], but has not been implemented in any APL, and would not be backwards-compatible in J, since J's Raze implicitly ravels its argument.
Raze can be extended to an argument array of rank greater than 1, allowing it to merge [[wikipedia:Block matrix|block matrices]] or higher-dimensional structures. This extension is part of [[BQN]], but has not been implemented in any APL, and would not be backwards-compatible in J, since J's Raze implicitly ravels its argument.


The axes of a high-rank argument should be paired with those of its element arrays, starting at the first axis (much like [[prefix agreement]]). The elements can be merged without adding fills when the length of an element along a particular axis depends only on its position along that axis in the outer array. That is, in <source lang=apl inline>⊃X</source>, <source lang=apl inline>⍴¨X</source> must match <source lang=apl inline>⊃∘.,/S</source>, where S is a vector containing <source lang=apl inline>≢⍴X</source> vectors followed by any number of scalars. In this case, the shape of <source lang=apl inline>⊃X</source> is <source lang=apl inline>+/¨S</source>. The result can be computed by performing a modified 1-dimensional Raze several times. The modified Raze should maintain some number of leading inner element axes. With the [[Rank operator]] (<source lang=apl inline>⍤</source>) we might write <source lang=apl inline>⍪⍤(1-≢⍴X)/X</source> for a single step in the process, thus reducing along the last axis and catenating along the same axis.
The axes of a high-rank argument should be paired with those of its element arrays, starting at the first axis (much like [[prefix agreement]]). The elements can be merged without adding fills when the length of an element along a particular axis depends only on its position along that axis in the outer array. That is, in <syntaxhighlight lang=apl inline>⊃X</syntaxhighlight>, <syntaxhighlight lang=apl inline>⍴¨X</syntaxhighlight> must match <syntaxhighlight lang=apl inline>⊃∘.,/S</syntaxhighlight>, where S is a vector containing <syntaxhighlight lang=apl inline>≢⍴X</syntaxhighlight> vectors followed by any number of scalars. In this case, the shape of <syntaxhighlight lang=apl inline>⊃X</syntaxhighlight> is <syntaxhighlight lang=apl inline>+/¨S</syntaxhighlight>. The result can be computed by performing a modified 1-dimensional Raze several times. The modified Raze should maintain some number of leading inner element axes. With the [[Rank operator]] (<syntaxhighlight lang=apl inline>⍤</syntaxhighlight>) we might write <syntaxhighlight lang=apl inline>⍪⍤(1-≢⍴X)/X</syntaxhighlight> for a single step in the process, thus reducing along the last axis and catenating along the same axis.


If the element arrays of <source lang=apl inline>X</source> do not satisfy the shape requirements, they could be padded with [[fill]]s to force this requirement to hold.
If the element arrays of <syntaxhighlight lang=apl inline>X</syntaxhighlight> do not satisfy the shape requirements, they could be padded with [[fill]]s to force this requirement to hold.


== External links ==
== External links ==

Navigation menu