4

是否有一个优雅的 PDL 函数接收一个值列表并返回一个包含 80% 的最低原始值的列表?

例如:如果我有一个这样的列表: (9, 4, 1, 2, 7, 8, 3, 5, 6, 10)

在原始列表上调用此函数后,我想获得 (1, 2, 3, 4, 5, 6, 7, 8) (值的顺序无关紧要 - 它不需要对值进行排序)。

我发现 PDL::Ufunc::oddpct 可以返回第 80 个百分位,但我想获得一个不超过该百分位的值列表。我可以自己做,但如果有开箱即用的东西 - 为什么不使用它呢?

谢谢!!!

4

3 回答 3

5

我建议您使用pct获得第 80 个百分位数的数字,结合where原语来选择该值以下的所有内容。使用您自己的数据,它看起来像这样

use strict;
use warnings;

use PDL;

my $list = pdl(9, 4, 1, 2, 7, 8, 3, 5, 6, 10);
print qsort $list->where($list <= $list->pct(80/100));

输出

[1 2 3 4 5 6 7 8]
于 2012-03-01T12:37:13.007 回答
0

好吧,这是你不想做的“自己做”,但它很容易。PDL 似乎对此很重。

use strict;
use warnings;

my @list = (9, 4, 1, 2, 7, 8, 3, 5, 6, 10);

my @slist = sort {$a <=> $b} @list;
my @list80 = @slist[0..int(0.8*@slist)-1];

print "@list80";
于 2012-03-01T14:42:14.303 回答
0

不是 PDL,但可能至少一样快:

Statistics::CaseResampling 的 select_kth 函数

于 2012-03-04T17:01:29.890 回答