对laspy创建的numpy数组进行排序
Sorting numpy array created by laspy
我知道这听起来像是一个简单的问题和一个简单的解决方案,但我就是无法理解它。
laspy
的文档有点稀疏,但到目前为止我已经很好地管理了。我认为这里的问题现在只是对 numpy 不够熟悉。
我想根据 GPS 时间对一个 numpy 数组进行排序。
这是我的立场:
我正在使用laspy自带的sample.las进行测试。
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]
我哪里错了?
据我对文档的理解,np.sort 似乎不支持就地排序。
np.ndarray.sort 然而确实如此。
所以
np.sort(lasPoints["point"]["gps_time"])
print(lasPoints)
将始终未排序。
但是对于你的问题:
您可以从列表中切出 GPS 时间列表,并使用 argsort 获取排序列表的索引。
这些可以用来对你的 laspoints 进行排序。
例如:
sorted_ind = np.argsort(list_of_gpstimes)
laspoints = laspoints[sorted_ind]
只是为了完全关闭它并建立在 dudakl 的答案上,使用 np.ndarray,排序,这对我有用:
np.ndarray.sort(lasPoints["point"],kind='mergesort',order='gps_time')
这里的关键是指定 lasPoint["points"] 然后按 gps_time.
排序
这里只会对 gps_time 列进行排序,不会对其他内容进行排序
np.ndarray.sort(lasPoints["point"]["gps_time])
我知道这听起来像是一个简单的问题和一个简单的解决方案,但我就是无法理解它。
laspy
的文档有点稀疏,但到目前为止我已经很好地管理了。我认为这里的问题现在只是对 numpy 不够熟悉。
我想根据 GPS 时间对一个 numpy 数组进行排序。
这是我的立场:
我正在使用laspy自带的sample.las进行测试。
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]
我哪里错了?
np.sort 似乎不支持就地排序。 np.ndarray.sort 然而确实如此。 所以
np.sort(lasPoints["point"]["gps_time"])
print(lasPoints)
将始终未排序。
但是对于你的问题: 您可以从列表中切出 GPS 时间列表,并使用 argsort 获取排序列表的索引。 这些可以用来对你的 laspoints 进行排序。 例如:
sorted_ind = np.argsort(list_of_gpstimes)
laspoints = laspoints[sorted_ind]
只是为了完全关闭它并建立在 dudakl 的答案上,使用 np.ndarray,排序,这对我有用:
np.ndarray.sort(lasPoints["point"],kind='mergesort',order='gps_time')
这里的关键是指定 lasPoint["points"] 然后按 gps_time.
排序这里只会对 gps_time 列进行排序,不会对其他内容进行排序
np.ndarray.sort(lasPoints["point"]["gps_time])