Ordering @ Порядок и рейтинг перестановок - PullRequest
6 голосов
/ 20 января 2011

Как указано nazdrovje (см. здесь ) Ordering@Ordering может использоваться для получения ранга каждого элемента в списке. Даже если список содержит повторяющиеся элементы, результатом является перестановка n (взятая в виде упорядоченного списка целых чисел от 1 до n без повторений), где элементу с наименьшим рейтингом присваивается 1, второму наименьшему 2 и т. Д. Как указывает Анджей Козловский , имеет место следующее (см. Также здесь ):

(Sort@mylist)[[Ordering@Ordering@mylist]]==mylist

Я хотел бы получить перестановочную ранжировку, в которой элементу с наивысшим рейтингом присваивается 1, второму наибольший 2 и т. Д., Так что выполняется следующее:

(Reverse@Sort@mylist)[[newPermutation]]==mylist

Это кажется простым, но мне удалось найти довольно неловкое решение. На данный момент я делаю следующее:

newPermutation= Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]

Есть ли более элегантный или более интуитивный способ? Там наверняка должно быть?

Пример:

mylist= {\[Pi],"abc",40,1, 300, 3.2,1};

Ordering@Ordering@mylist

Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]

Вывод (обратите внимание на взаимную связь между перестановками)

{7,6,4,1,5,3,2}
{1,2,4,7,3,5,6}

(оба следующие значения имеют значение True)

Sort@mylist)[[Ordering@Ordering@mylist]]== mylist
Reverse@Sort@mylist)[[ Ordering@Ordering[Ordering@Ordering@mylist,All,Greater]]]== mylist

1 Ответ

4 голосов
/ 20 января 2011

Если вы установите

 oldPerm = Ordering@Ordering@mylist

, то

 newPerm = - oldPerm + Length@mylist + 1

и

(Reverse@Sort@mylist)[[newPerm]]==mylist

будет True


Таким образом, вы можете определить

newPerm[x_] := 1 + Length@x - Ordering@Ordering@x

Например,

(Reverse@Sort@mylist)[[newPerm[mylist]]] == mylist  

равно True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...