Упорядочение@Упорядочение и ранжирование перестановок

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

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

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

(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]

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

{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 ответов


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

 oldPerm = Ordering@Ordering@mylist

затем

 newPerm = - oldPerm + Length@mylist + 1

и

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

is True


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

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

например

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

is True