Предположим, у меня есть 3 массива (я знаю количество массивов заранее), которые я хочу сортировать по элементам. Например, предположим, что у меня есть:
import numpy as np
x = np.array([
[100, 200, 300],
[400, 500, 600],
[700, 800, 900]
])
y = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
])
z = np.array([
[10, 20, 30],
[40, 50, 60],
[70, 80, 90]
])
И я хочу получить заказ для каждого элемента:
[
[[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]],
[[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]],
[[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]], [[0, 2, 1], [0, 2, 1], [0, 2, 1]]
]
В этом случае все позиции находятся в одном порядке, чтобы простой пример (0> 2> 1), но на самом деле каждый элемент на каждом массиве мог быть больше, чем его аналог другого массива. Я также работаю с массивами больших размеров (3d, а не 2d), но я думаю, что общая идея будет такой же.
Я считаю, что мне нужно изменить формы массивов, а затем np.argsort
их (или просто регулярные np.sort
, меня больше интересуют значения, а не откуда они пришли, хотя если накладные расходы на то, что источник np.sort
, это может быть полезно по линии). Но я не уверен, как их изменить, чтобы я мог применить операцию. Гарантируется, что все массивы имеют одинаковую форму, и, несмотря на мой пример, это всегда будет четное число.
Я не уверен, что формат, который я имею в виду, был бы хорош для индексирования после моего заказа, но на данный момент я не могу найти лучший способ сгруппировать результаты. Я считаю, что я могу просто разбить их позже с чем-то вроде answer[...,0]
для максимальных индексов (или максимальных значений), answer[...,1]
на второй и т.д. Хотя, если у меня есть индексы, мне придется сопоставлять их позже с массивами. Не должно быть так сложно, я думаю, мне просто нужно было np.stack
их вместе, я верю.
Какие-либо предложения?
Вы можете использовать dstack()
чтобы связать их вместе над последней осью, а затем использовать np.sort()
над ожидаемой осью, чтобы отсортировать массив:
In [10]: arr = np.dstack((x, y, z))
In [11]: arr.sort(2)
In [12]: arr
Out[12]:
array([[[ 1, 10, 100],
[ 2, 20, 200],
[ 3, 30, 300]],
[[ 4, 40, 400],
[ 5, 50, 500],
[ 6, 60, 600]],
[[ 7, 70, 700],
[ 8, 80, 800],
[ 9, 90, 900]]])
И если вы хотите получить результат в порядке убывания:
In [13]: arr[:,:,::-1]
Out[13]:
array([[[100, 10, 1],
[200, 20, 2],
[300, 30, 3]],
[[400, 40, 4],
[500, 50, 5],
[600, 60, 6]],
[[700, 70, 7],
[800, 80, 8],
[900, 90, 9]]])