【问题标题】:How do I extract specific rows from a PDL matrix?如何从 PDL 矩阵中提取特定行?
【发布时间】:2019-01-22 15:50:51
【问题描述】:

假设我有:

$a = [
      [1, 0, 1]
      [0, 1, 0]
      [0, 1, 1]
     ]

我想提取$row[2] == 1 所在的所有行。我得到的 piddle 看起来像:

$b = [
      [1, 0, 1]
      [0, 1, 1]
     ]

PDL 可以做到这一点吗?

【问题讨论】:

    标签: perl pdl


    【解决方案1】:

    您需要使用which 生成矩阵的索引列表,其中第三列的值为 1

    which($aa->index(2) == 1)
    

    并将其传递给dice_axis,它将选择具有给定索引的行。轴 0 是列,轴 1 是行,所以代码如下所示

    use strict;
    use warnings 'all';
    
    use PDL;
    
    my $aa = pdl <<__END_PDL__;
    [
      [1, 0, 1]
      [0, 1, 0]
      [0, 1, 1]
    ]
    __END_PDL__
    
    my $result = $aa->dice_axis(1, which($aa->index(2) == 1));
    
    print $result;
    

    输出

    [
     [1 0 1]
     [0 1 1]
    ]
    

    【讨论】:

    • 谢谢!看起来我可以使用多个条件,比如$aa-&gt;dice_axis(1, which($aa-&gt;index(0) == 1 &amp; $aa-&gt;index(2) == 1))。对吗?
    • @marcantonio:几乎是的。但是 Perl 中的 &amp; 是位掩码运算符;您需要&amp;&amp;and,它们相同但优先级不同。
    • 我遇到了这个:pdl.perl.org/…,这就是我使用&amp;而不是&amp;&amp;的原因。
    【解决方案2】:

    我是PDL 的新手,但您似乎可以使用which 结果作为掩码。

    你需要先transpose原来的变量,然后transpose在使用slice后返回。

    pdl> $a = pdl [[1, 0, 1], [0, 1, 0], [0, 1, 1]]
    
    pdl> p which($a(2) == 1)
    [0 2]
    
    pdl> p $a->transpose    
    
    [
     [1 0 0]
     [0 1 1]
     [1 0 1]
    ]
    
    pdl> p $a->transpose->slice(which($a(2) == 1))->transpose
    
    [
     [1 0 1]
     [0 1 1]
    ]
    

    【讨论】:

    • 请注意,如果不添加 use PDL::NiceSlice,这将无法在 Perl 程序中工作。这个模块允许更简洁的slice/dice 表达式,但是它使用了源过滤,这通常是一个坏事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2012-12-27
    • 2018-08-18
    • 2019-11-17
    • 1970-01-01
    • 2011-09-05
    • 2018-05-12
    相关资源
    最近更新 更多