3

鉴于我有一个带形状的盒装数组4 3

v =. 4 3$'x1'; 'y1'; 'z1'; 'x2'; 'y2'; 'z2'; 'x3'; 'y3'; 'z3'
v
NB. +--+--+--+
NB. |x1|y1|z1|
NB. +--+--+--+
NB. |x2|y2|z2|
NB. +--+--+--+
NB. |x3|y3|z3|
NB. +--+--+--+
NB. |x1|y1|z1|
NB. +--+--+--+

选择

我可以通过1{::v

1{::v
NB. Get the second row
NB. +--+--+--+
NB. |x2|y2|z2|
NB. +--+--+--+

投影

但是如何访问第二列?

NB. Get the second column
NB. +--+
NB. |y1|
NB. +--+
NB. |y2|
NB. +--+
NB. |y3|
NB. +--+
NB. |y1|
NB. +--+
4

3 回答 3

6

{您还可以指定 Rank "

1 {"1 v
NB. +--+--+--+--+
NB. |y1|y2|y3|y4|
NB. +--+--+--+--+

这将为您提供第二列,减去排名,因此只是一个 shape 数组4。要使其成型4 1,请使用 Ravel Items ,.

,.1 {"1 v
NB. +--+
NB. |y1|
NB. +--+
NB. |y2|
NB. +--+
NB. |y3|
NB. +--+
NB. |y1|
NB. +--+

此外,所有这些逻辑都适用于矩阵是否被装箱。

于 2013-01-28T15:15:39.647 回答
3

正如其他海报所观察到的,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”(复数)这个短语会更准确。从这个意义上说,可以在不失一般性的情况下对所给出的散文和示例进行复数替换(事实上,获得它:该语言鼓励在数组中思考,即同时在多个维度方面)。

于 2013-07-08T20:13:15.553 回答
2

投影是转置矩阵上的选择

  1. 使用|:转置
  2. 选择第二(前一列)1{::
  3. 4 1$再次将结果重塑为垂直结果

总而言之

4 1$1{::|:v
NB. Get the second column
NB. +--+
NB. |y1|
NB. +--+
NB. |y2|
NB. +--+
NB. |y3|
NB. +--+
NB. |y1|
NB. +--+
于 2013-01-28T11:07:44.900 回答