Упорядочение@Упорядочение и ранжирование перестановок
как отметил 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