Сортировка нескольких массивов по элементам поэлементно

1

Предположим, у меня есть 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 их вместе, я верю.

Какие-либо предложения?

Теги:
arrays
numpy
multidimensional-array

1 ответ

0
Лучший ответ

Вы можете использовать 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]]])
  • 0
    Мне нужно, чтобы они сохранили свои позиции. Например, 100 должно быть элементом [0, 0] в моем результате (10 и 1 тоже, когда они появляются). Хотя это может быть вопросом изменения отсортированных результатов, если я не ошибаюсь.
  • 0
    @animetiddies Ну, все они находятся на одной оси, к которой вы можете получить доступ с помощью простой индексации. Я не уверен, как вы хотите использовать их, что невозможно при индексировании, но да, вы всегда можете изменить форму массива, если хотите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню