Pythonic и эффективный способ сортировки 2D-массив вдоль столбца - PullRequest
1 голос
/ 19 октября 2019

У меня есть два массива, где A является одномерным. B - это двумерный массив (квадратная матрица с одинаковым количеством элементов по обеим осям, как в A).

Мне нужно было сортировать столбцы по B при сортировке A в порядке возрастания. Следующий код работает, но мне интересно, можно ли это сделать без использования присваивания новому массиву и цикла for.

В поисках более эффективных способов сделать то же самое. Спасибо.

import numpy as np

A=np.random.randint(1,50,6)
B=np.random.randint(1,50,(6,6))
print ("A = ",A,"\n \nB = \n", B)

ind = np.argsort(A, axis=0)
print("\nSorting index = \n",ind)

C=A[ind]
print("\nSorted A = \n",C)

D=np.empty_like(B)
for i in range(6):
    D[:,i] = B[:,ind[i]]

print("\nSorted B along the columns = \n",D) 

Вывод:

A =  [40  1 12 42 15  3] 

B = 
 [[43 20 26 15 24 13]
 [36  7 47 14 36 11]
 [44 19 41 32 14 43]
 [27 11 46 44 35 22]
 [26 18  4 40 40 23]
 [27 23 30 49 28 12]]

Sorting index = 
 [1 5 2 4 0 3]

Sorted A = 
 [ 1  3 12 15 40 42]

Sorted B along the columns = 
 [[20 13 26 24 43 15]
 [ 7 11 47 36 36 14]
 [19 43 41 14 44 32]
 [11 22 46 35 27 44]
 [18 23  4 40 26 40]
 [23 12 30 28 27 49]]

1 Ответ

1 голос
/ 19 октября 2019

Вы можете наверняка нарезать B векторизованным способом. Вы даже можете сделать это без временного создания массива индекса:

D = B[:,np.argsort(A, axis=0)]

Более подробный вывод

In [13]: A
Out[13]: array([40,  1, 12, 42, 15,  3])

In [14]: B
Out[14]:
array([[43, 20, 26, 15, 24, 13],
       [36,  7, 47, 14, 36, 11],
       [44, 19, 41, 32, 14, 43],
       [27, 11, 46, 44, 35, 22],
       [26, 18,  4, 40, 40, 23],
       [27, 23, 30, 49, 28, 12]])

In [15]: D = B[:,np.argsort(A, axis=0)]

In [16]: D
Out[16]:
array([[20, 13, 26, 24, 43, 15],
       [ 7, 11, 47, 36, 36, 14],
       [19, 43, 41, 14, 44, 32],
       [11, 22, 46, 35, 27, 44],
       [18, 23,  4, 40, 26, 40],
       [23, 12, 30, 28, 27, 49]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...