отмените или реверс argsort (), Python

Учитывая массив я хотел бы отсортировать массив по столбцам sort(a, axis=0) сделайте некоторый материал к массиву и затем отмените вид. Этим я не имею в виду вид ре, но в основном инвертирование, как каждый элемент был перемещен. Я принимаю argsort() то, в чем я нуждаюсь, но мне не ясно, как отсортировать массив с результатами argsort() или, что еще более важно, примените реверс/инверсию argsort()

Вот немного больше детали

У меня есть массив a, shape(a) = rXc Я должен отсортировать каждый столбец

aargsort = a.argsort(axis=0)  # May use this later
aSort = a.sort(axis=0)

теперь среднее число каждая строка

aSortRM = asort.mean(axis=1)

теперь замените каждое седло подряд средней строкой. есть ли лучший путь, чем это

aWithMeans = ones_like(a)
for ind in range(r)  # r = number of rows
    aWithMeans[ind]* aSortRM[ind]

Теперь я должен отменить вид, который я сделал в первом шаге.????

20
задан sophros 16 September 2019 в 09:22
поделиться

3 ответа

Я не уверен, как лучше всего это сделать в numpy , но в чистом Python рассуждение было бы следующим:

aargsort содержит перестановку диапазона ( len (a)) сообщает вам, откуда взялись элементы aSort - во многом как в чистом Python:

>>> x = list('ciaobelu')
>>> r = range(len(x))
>>> r.sort(key=x.__getitem__)
>>> r
[2, 4, 0, 5, 1, 6, 3, 7]
>>> 

т.е. первый аргумент sorted (x) ] будет x [2] , второй будет x [4] и так далее.

Итак, учитывая отсортированную версию, вы можете восстановить оригинал, «вернув элементы туда, откуда они были»:

>>> s = sorted(x)
>>> s
['a', 'b', 'c', 'e', 'i', 'l', 'o', 'u']
>>> original = [None] * len(s)
>>> for i, c in zip(r, s): original[i] = c
... 
>>> original
['c', 'i', 'a', 'o', 'b', 'e', 'l', 'u']
>>> 

Конечно, будут более жесткие и быстрые способы выразить это в numpy (который, к сожалению, я не знаю наизнанку так же, как сам Python ;-), но я надеюсь, что это поможет, показывая основную логику операции «вернуть вещи на место», которые вам необходимо выполнить.

5
ответ дан 29 November 2019 в 23:00
поделиться

Вероятно, существуют лучшие решения проблемы, которую вы пытаетесь решить, чем это (выполнение argsort обычно исключает необходимость фактической сортировки), но вот, пожалуйста:

>>> import numpy as np
>>> a = np.random.randint(0,10,10)
>>> aa = np.argsort(a)
>>> aaa = np.argsort(aa)
>>> a # original
array([6, 4, 4, 6, 2, 5, 4, 0, 7, 4])
>>> a[aa] # sorted
array([0, 2, 4, 4, 4, 4, 5, 6, 6, 7])
>>> a[aa][aaa] # undone
array([6, 4, 4, 6, 2, 5, 4, 0, 7, 4])
41
ответ дан 29 November 2019 в 23:00
поделиться

Я не смог проследить за вашим примером, но более абстрактная проблема - т.е. как отсортировать массив, а затем отменить сортировку - проста.

import numpy as NP
# create an 10x6 array to work with
A = NP.random.randint(10, 99, 60).reshape(10, 6)
# for example, sort this array on the second-to-last column, 
# breaking ties using the second column (numpy requires keys in
# "reverse" order for some reason)
keys = (A[:,1], A[:,4])
ndx = NP.lexsort(keys, axis=0)
A_sorted = NP.take(A, ndx, axis=0)

"Восстановить" A из A_sorted тривиально, потому что помните, что вы использовали индексный массив ('ndx') для сортировки массива в первую очередь.

# ndx array for example above:  array([6, 9, 8, 0, 1, 2, 4, 7, 3, 5])

Другими словами, 4-я строка в A_sorted была 1-й строкой в исходном массиве, A, и т. д.

1
ответ дан 29 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: