Учитывая массив я хотел бы отсортировать массив по столбцам 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]
Теперь я должен отменить вид, который я сделал в первом шаге.????
Я не уверен, как лучше всего это сделать в 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 ;-), но я надеюсь, что это поможет, показывая основную логику операции «вернуть вещи на место», которые вам необходимо выполнить.
Вероятно, существуют лучшие решения проблемы, которую вы пытаетесь решить, чем это (выполнение 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])
Я не смог проследить за вашим примером, но более абстрактная проблема - т.е. как отсортировать массив, а затем отменить сортировку - проста.
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, и т. д.