正如其他海报所观察到的,J 中的数组访问权重朝向主(前)轴。也就是说,J 语言可以很容易地沿数组长度寻址元素(第一项、第二项、第三项等)。
要访问非引导轴,J 程序员通常会采用以下两种策略之一,分别由 abstraktor 和 MPelletier 的响应证明:
更改数组,使感兴趣的轴实际上成为引导轴;在您的情况下,通过将第二个(“列”)轴转换为第一个(“行”)轴,如使用|:
.
或者更改访问器函数的视角,使感兴趣的轴从访问器的角度看起来像引导轴。MPelletier 的解决方案就是一个例子,它{
使用 rank ( "
) 改变了(在您的情况下是访问器函数)的视角。在他的示例中,POV{
一次仅限于一行,因此现在从该函数的角度来看,引导轴是每行的原子——当聚合时,它们对应于列(当然)。
所以这些是在 J 中访问非引导轴的主要方法。话虽如此,某些原始函数实际上可以直接处理非引导轴。事实上,{
如果你正确格式化它的参数,它就是其中之一:
(<a:;1) { v
+--+--+--+--+
|y1|y2|y3|y1|
+--+--+--+--+
在这里,我们将一个装箱的左参数传递给{
. 当我们这样做时,就{
知道该框本身包含一个框列表:每个轴一个框(item-in-the-shape-of)它的正确参数。这些(子)框中的每一个都将指示正确参数的相应轴的选择标准。在这里,我们用“ a:
”表示第一个轴的“a”ll,用1表示第二个轴的第二个元素(即第二列)。我们还可以混合搭配,例如“第二行和第三行的第一列和最后一列”:
(<1 2;0 _1) { v
+--+--+
|x2|z2|
+--+--+
|x3|z3|
+--+--+
当然,这以明显的方式扩展到 N 维数组。
因此,您可以使用{
直接处理数组的非前导轴。某些其他原语共享此功能,当然它们仍然在寻址轴上执行其定义的功能(因此,如果您只想选择数据,请使用{
)。
假设您想将数组切割(分区)为列,而不是更常见的行。然后你可以使用;.
( cut ) ,但用一个盒装的左手参数代替通常的开放式 LHA:
('';1) <;.1 v
+----+----+----+
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
||x2|||y2|||z2||
|+--+|+--+|+--+|
||x3|||y3|||z3||
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
+----+----+----+
事实上,我们可以使用这种方法同时寻址多个轴;例如,我们可以将数组分组为按每列划分的行对(即分成 2x1 子数组):
(1 0 1 0;1) <;.1 v
+----+----+----+
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
||x2|||y2|||z2||
|+--+|+--+|+--+|
+----+----+----+
|+--+|+--+|+--+|
||x3|||y3|||z3||
|+--+|+--+|+--+|
||x1|||y1|||z1||
|+--+|+--+|+--+|
+----+----+----+
或者,假设您不想选择列,而是想删除一些列。然后您可以将}.
( drop ) 与向量 LHA 一起使用,而不是通常的标量:
0 1 }. v NB. Keep all the rows but drop the first column
+--+--+
|y1|z1|
+--+--+
|y2|z2|
+--+--+
|y3|z3|
+--+--+
|y1|z1|
+--+--+
2 _1 }. v NB. drop the first two rows and the last column
+--+--+
|x3|y3|
+--+--+
|x1|y1|
+--+--+
对于{.
( take ) 也是如此:
_ 1 {. v NB. Take all the rows (_=∞) but only 1 column (the first)
+--+
|x1|
+--+
|x2|
+--+
|x3|
+--+
|x1|
+--+
类似地,向量 LHA 到|.
( rotate ) 允许我们来回旋转数组的任何维度(或维度):_2 |. v
将旋转v
两个位置的行,而0 1 |. v
将列旋转一个位置(向后),并且_2 1 |. v
将两者都做(所以左上角是“y3”)。
向量 LHA 还允许转置处理任何轴集合,并立即将它们全部移动到数组的后面(即转置它们):
$ 1 2 |: i. 11 22 33 44 NB. Transpose the middle dimensions to the end
11 44 22 33
$ 1 2 0 3 |: i. 11 22 33 44 NB. Mix up all dimensions
22 33 11 44
等等
总而言之,J 语言旨在使谈论“主轴”(即第一轴)变得容易,因为在实践中这是最常见的用例。要谈论短轴,通常您会在物理上翻转数组(使用|:
)以将感兴趣的轴置于最前面,或者您将修改函数的视角(使用"
)以从该函数的角度获得等效效果观点。
此外,当需要时,J 提供了某些内置工具来直接处理非引导轴,如上所述。
注意:为使示例简单,前面的讨论使用了单数形式的短语“感兴趣的轴”。但鉴于 J 的面向数组的性质,使用“感兴趣的axE”(复数)这个短语会更准确。从这个意义上说,可以在不失一般性的情况下对所给出的散文和示例进行复数替换(事实上,获得它:该语言鼓励在数组中思考,即同时在多个维度方面)。