Perl PDL - получение 80% самых низких значений в векторе

Существует ли элегантная функция PDL, которая получает список значений и возвращает список из 80% исходных значений, которые являются самыми низкими?

Например: если у меня есть такой список: (9, 4, 1, 2, 7, 8, 3, 5, 6, 10)

Я хотел бы получить (1, 2, 3, 4, 5, 6, 7, 8) после вызова этой функции в исходном списке (порядок значений не имеет значения - не нужно сортировать значения).

Я нашел PDL::Ufunc::oddpct, который может возвращать 80-й процентиль, но я хотел бы получить список значений до этого процентиля. Сам могу сделать, но если есть что-то из коробки - почему бы не использовать?

Спасибо!!!


person N.M    schedule 01.03.2012    source источник


Ответы (3)


Я предлагаю вам использовать 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]
person Borodin    schedule 01.03.2012

Ну, это "сделай сам", что вы не хотите делать, но это так просто. 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";
person Bill Ruppert    schedule 01.03.2012

Не PDL, но, вероятно, по крайней мере так же быстро:

Statistics::CaseResampling, функция select_kth< /а>

person tsee    schedule 04.03.2012