Сортировка массива numy, созданного laspy
Я знаю, что это выглядит как простая проблема с простым решением, но я просто не могу обернуть голову вокруг этого.
Документация для laspy
немного скудно, но я пока хорошо справился. Я думаю, что проблема здесь в том, что сейчас просто недостаточно знаком с numpy.
Я хочу отсортировать массив на основе времени GPS.
Вот где я стою:
Я использую sample.las, который поставляется с laspy для тестирования.
import laspy
import numpy as np
#open the file
lasFile = laspy.file.File("C:/Anaconda3/Lib/site-packages/laspytest/data/simple.las", mode = "rw")
#put points in numpy array
lasPoints = lasFile.points
Я пытаюсь отсортировать массив по столбцу gps_time.
print(lasPoints.dtype)
дает мне
[('point', [('X', '<i4'), ('Y', '<i4'), ('Z', '<i4'), ('intensity', '<u2'), ('flag_byte', 'u1'), ('raw_classification', 'u1'), ('scan_angle_rank', 'i1'), ('user_data', 'u1'), ('pt_src_id', '<u2'), ('gps_time', '<f8'), ('red', '<u2'), ('green', '<u2'), ('blue', '<u2')])]
а также
print(lasPoints)
дает мне
[ ((63701224, 84902831, 43166, 143, 73, 1, -9, 132, 7326, 245380.78254963, 68, 77, 88),)
((63689633, 84908770, 44639, 18, 81, 1, -11, 128, 7326, 245381.45279924, 54, 66, 68),)
((63678474, 84910666, 42671, 118, 9, 1, -10, 122, 7326, 245382.13595007, 112, 97, 114),)
...,
((63750167, 85337575, 41752, 43, 9, 1, 11, 124, 7334, 249772.21013494, 100, 96, 120),)
((63743327, 85323084, 42408, 31, 9, 1, 11, 125, 7334, 249772.70733372, 176, 138, 164),)
((63734285, 85324032, 42392, 116, 73, 1, 9, 124, 7334, 249773.20172407, 138, 107, 136),)]
Для доступа к gps_time я могу запустить
lasPoints[0][0][9] ## first gps_time in array
lasPoints[1][0][9] ## second gps_time in array
Замена "gps_time" на 9 дает тот же результат.
Теперь, когда я пытаюсь отсортировать мои данные, на самом деле кажется, что ничего не сортируется:
np.sort(lasPoints["point"]["gps_time"])
print(lasPoints)
Массив распечатывается несортированным и, как есть,
lasPoints=np.sort(lasPoints["point"]["gps_time"])
print(lasPoints)
Результаты в gps_time сортируются следующим образом:
[ 245370.41706456 245370.74331403 245371.06452222 ..., 249782.07498673
249782.64531958 249783.16215837]
Куда я здесь не так?
2 ответа
np.sort не поддерживает сортировку на месте, насколько я понимаю документацию. np.ndarray.sort однако делает. Так
np.sort(lasPoints["point"]["gps_time"])
print(lasPoints)
всегда будет несортированным.
Но к вашей проблеме: вы можете вырезать список времени GPS из вашего списка и использовать argsort, чтобы получить индексы для отсортированного списка. Затем они могут быть использованы для сортировки ваших точек лазания. например:
sorted_ind = np.argsort(list_of_gpstimes)
laspoints = laspoints[sorted_ind]
Просто чтобы закрыть это полностью и использовать ответ Дудакла, используя np.ndarray,sort, вот что сработало для меня:
np.ndarray.sort(lasPoints["point"],kind='mergesort',order='gps_time')
Ключевым моментом здесь было указать lasPoint["points"], а затем упорядочить по gps_time.
Это здесь будет только сортировать колонку gps_time и ничего не делать
np.ndarray.sort(lasPoints["point"]["gps_time])