Как отсортировать по первому элементу элемента массива? - PullRequest
1 голос
/ 09 июля 2020

предположим, что у меня есть массив формы

a = [ 
  [ [12, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 10, 2], [7, 10, 3 ,2] ],
  [ [13, 23, 4, 5] , [10, 12, 4, 2], [2, 2, 12, 1], [7, 10, 3 ,2] ],
  [ [4, 4, 2, 5] , [10, 12, 4, 2], [2, 2, 3, 2], [7, 10, 3 ,2] ], 
] 

Я хочу отсортировать по первому столбцу каждого элемента, поэтому первая запись a будет выглядеть так:

[ [2, 2, 10, 2], [7, 10, 3 ,2], [10, 12, 4, 2], [12, 4, 2, 5] ]

Я нашел решение, которое выглядит как a[a[:,1].argsort()], и попробовал a для l oop по первому индексу, например:

for i in range(0,4):
  a[i,...] = a[a[i,0,:].argsort()]

или

for i in range(0,4):
  a[i,...] = a[i, a[i,0,:].argsort()]

Это не т работать хотя. Я действительно не могу понять эту проблему.

Ответы [ 3 ]

2 голосов
/ 09 июля 2020

Вы можете использовать argsort массива, проиндексированного по первым столбцам, с соответствующим расширением тусклого цвета, а затем np.take_along_axis:

ixs = a[...,0].argsort(1)[...,None]
np.take_along_axis(a, ixs, 1)

array([[[ 2,  2, 10,  2],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2],
        [12,  4,  2,  5]],

       [[ 2,  2, 12,  1],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2],
        [13, 23,  4,  5]],

       [[ 2,  2,  3,  2],
        [ 4,  4,  2,  5],
        [ 7, 10,  3,  2],
        [10, 12,  4,  2]]])
1 голос
/ 09 июля 2020

Попробуйте:

sorted_array = [sorted(x, key=lambda y: y[0]) for x in a]

Как это работает?

  • сначала мы используем понимание списка, чтобы сопоставить массив a с новым, выполняя операция над каждым элементом (например, [x + 1 for x in my_numbers])

  • Операция, которую мы выполняем над каждым элементом a, заключается в использовании sorted. Это возвращает копию массива, отсортированную путем сравнения любого значения, возвращаемого key.

  • key должна быть функцией, которая возвращает «сортируемое» значение. Здесь мы используем lambda для создания однострочной функции, которая возвращает первый элемент из переданного ей массива. Это обеспечивает сортировку на основе первого столбца каждого элемента a.

0 голосов
/ 09 июля 2020

Если вы не хотите использовать лямбда-метод, попробуйте этот:

def select(item):
  return item[0]


s_array=[]
for i in a:
  s_array.append(sorted(i, key=select))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...