【问题标题】:How do I access the n-th column of a boxed array?如何访问盒装数组的第 n 列?
【发布时间】:2013-01-28 11:07:44
【问题描述】:

鉴于我有一个形状为 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. +--+

【问题讨论】:

    标签: arrays j


    【解决方案1】:

    您还可以使用" 指定{ 的等级:

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

    这将为您提供第二列,减去一个排名,因此只是一个形状为4 的数组。要让它成形4 1,请使用拉威尔物品,.

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

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

    【讨论】:

    • 对我来说,这似乎是“正确”的方式。不过请注意:{ 的左侧参数有一个形状,因此您可以使用 (,1) {"1 v 将列作为列来获取。
    • @Eelvex 很好的提及。在单个列中显示这样的数据并不是很自然,但是如果需要这种布局,则使用$,. 进行整形比在操作期间使用@987654332 的整形索引更明确@。但它确实有效。
    • 是的,如果需要是装饰性的(即关于显示,而不是后续计算),那么后续的重塑似乎更清晰。在我看来,这个问题要求一个形状为 (1 4) 的结果,在这种情况下,在左侧参数中包含形状似乎更清晰。 J 的经验告诉我们,我们通常希望将列提取为简单列表,而不是“列”(带有额外的轴),但学习需要同时使用两者。
    【解决方案2】:

    正如其他海报所观察到的,J 中的数组访问权重朝向主(前)轴。也就是说,J 语言可以很容易地沿数组长度寻址元素(第一项、第二项、第三项等)。

    要访问非引导轴,J 程序员通常会采用以下两种策略之一,这分别由 abstraktor 和 MPelletier 的回应证明:

    • 改变数组,让感兴趣的轴实际上变成引导轴;在您的情况下,通过将第二个(“列”)轴转换为第一个(“行”)轴,如使用 |: 的抽象解决方案中所示。

    • 或者更改访问器函数的视角,使感兴趣的轴看起来从访问器的角度来看是引导轴。 MPelletier 的解决方案就是一个例子,它使用 rank (") 改变了{(在您的情况下是访问器函数)的视角。在他的示例中,{ 的 POV 一次被限制为一行,因此现在从该函数的角度是每行的原子——当聚合时,对应于列(当然)。

    所以这些是在 J 中访问非引导轴的主要方法。话虽如此,某些原始函数实际上可以直接处理非引导轴。事实上,{ 就是其中之一,如果你正确格式化它的参数:

       (<a:;1) { v
    +--+--+--+--+
    |y1|y2|y3|y1|
    +--+--+--+--+
    

    在这里,我们将 boxed 左参数传递给 { 。当我们这样做时,{ 理解该框本身包含一个框列表:每个轴一个框(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|
    +--+--+
    

    {. 类似(采取):

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

    【讨论】:

      【解决方案3】:

      投影是转置矩阵上的选择

      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. +--+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多