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

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

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

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

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

Спасибо !!!

Ответы [ 3 ]

5 голосов
/ 01 марта 2012

Я предлагаю вам использовать 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));

OUTPUT

[1 2 3 4 5 6 7 8]
0 голосов
/ 04 марта 2012

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

Статистика :: Функция select_kth CaseResampling

0 голосов
/ 01 марта 2012

Ну, это "сделай сам", что ты не хочешь делать, но это так просто.ПДЛ, кажется, может быть тяжелым для этого.

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";
...