1

我知道这听起来像是一个简单的解决方案的简单问题,但我就是无法理解它。

的文档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]

我在哪里错了?

4

2 回答 2

3

只是为了完全关闭它并基于 dudakl 的答案,使用 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]) 
于 2017-10-20T08:24:02.613 回答
2

据我了解文档,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]
于 2017-10-20T07:37:49.943 回答