如何从PDL矩阵中提取特定行?

时间:2018-08-15 18:19:46

标签: perl pdl

假设我有

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

,我想提取$row[2] == 1处的所有行。我产生的困惑看起来像:

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

PDL是否可能?

2 个答案:

答案 0 :(得分:3)

您需要使用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]
]

答案 1 :(得分:1)

我是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]
]