Сортировать массив numpy по заданному столбцу c - PullRequest
0 голосов
/ 27 марта 2020

Рассмотрим массив numpy, например:

  coords =   [[34. 22.]
              [11. 38.]
              [22. 56.]
              [23. 22.]
              [86. 30.]]

Этот массив содержит координаты x и y 5 точек. Я ищу точку в этом массиве, которая имеет наименьшую координату Y. Я могу легко найти его, используя

idx = np.argpartition(coords[:,1],1)[0]
pt = coords[idx]

Нет проблем. За исключением того, что на самом деле в coords есть две точки с одинаковым наименьшим значением y: 22 * ​​1008 *

Мне нужна точка с меньшим значением x, т. Е. Вместо [34 22] Я хочу [23 22] ,

Это уже не тривиально. Потому что я хочу найти такие точки для произвольной матрицы координат. Т.е. может быть много точек с равной наименьшей координатой y. Больше чем два. А потом я хочу отсортировать их в соответствии с их X-координаты.

Я начинал решать эту проблему с уродливым -1 oop, но не смог. Это то, что я до сих пор:

noPoints = coords.shape[0]

y = []
for i in range(0, noPoints-1):
    minIdx = 0
    for j in range(i+1, noPoints):
        if coords[j][1] < coords[i][1]:
            minIdx = j

Хорошо. Я могу найти наименьшее значение у. Но это все. Я начинаю верить, что эту задачу невозможно решить с помощью numpy -массивов.

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вы можете сделать это с помощью структурированного numpy массива и необязательного ключевого слова order= в сортировке numpy :

>>> x = np.array([(34.,22.),(11., 38.),(22.,56.),(23., 22.),(86.,30.)], dtype = [('x',float),('y',float)])
>>> x
array([(34., 22.), (11., 38.), (22., 56.), (23., 22.), (86., 30.)],
  dtype=[('x', '<f8'), ('y', '<f8')])
>>> x.sort(order = ['y','x'])
>>> x
array([(23., 22.), (34., 22.), (86., 30.), (11., 38.), (22., 56.)],
  dtype=[('x', '<f8'), ('y', '<f8')])
0 голосов
/ 27 марта 2020

вы можете использовать np.lexsort :

coords[np.lexsort((coords[:,1], coords[:,0]))]

вывод:

array([[11., 38.],
       [22., 56.],
       [23., 22.],
       [34., 22.],
       [86., 30.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...