Сортировать трехмерный массив по определенному размеру и элементу - PullRequest
0 голосов
/ 16 мая 2019

если у меня есть 3D-массив; такие как:

[
  [
    [10,2],
    [5,3],
    [4,4]
  ],
  [
    [7,6],
    [4,2],
    [5,8]
  ]
] 

Я хочу отсортировать их по 3-е затемнение и 1-е значение.

Значит, результат должен быть

[
  [
    [4,4],
    [5,3],
    [10,2]
  ],
  [
    [4,2],
    [5,8],
    [7,6]
  ]
]

Как я могу сделать это на питоне?

Thx

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Способ сделать это - использовать метод list.sort или отсортированную функцию вместе с соответствующим значением параметра key (см. Документацию: howto / sorting ) .

Документация Python отлично справляется с объяснением назначения параметра key :

"Оба list.sort () и sorted () имеют параметр key для указания функции , вызываемой каждого элемента списка до до создания сравнения. "

Например, давайте отсортируем первый элемент вашего списка:

first=[[10, 2], [5, 3], [4, 4]]

def by_first(element):

    """
    Sort a two-dimensional list by the first element 

    Param: element of the list i.e [10, 2]
    Return: first item of element
    """

    return element[0]

Итак, для сортировки списка выше мы делаем это

sorted(first,key=by_first)

Наконец, чтобы решить начальную задачу (трехмерный список), мы просто должны сделать выше для каждого элемента вашего списка

list_numbers = [[[10, 2], [5, 3], [4, 4]], [[7, 6], [4, 2], [5, 8]]]

[sorted(entry, key=by_first) for entry in list_numbers]
0 голосов
/ 16 мая 2019

Если вы ищете что-то более связанное с массивами (не списками), вы можете попробовать следующее:

import numpy as np

a = np.array([[[10,2],
               [5,3],
               [4,4]],

              [[7,6],
               [4,2],
               [5,8]]])
b = np.zeros(a.shape)

sorted_idx = np.argsort(a, axis=1)

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        b[i, j] = a[i, sorted_idx[i, j, 0]]

print(b.astype(int))

# [[[ 4  4]
#   [ 5  3]
#   [10  2]]
# 
#  [[ 4  2]
#   [ 5  8]
#   [ 7  6]]]

Обратите внимание, что на самом деле, согласно ожидаемому результату, вам нужно отсортировать по первому элементу axis=1, а не по последней оси.

...