我在分析激光扫描仪生成的大量点云数据。在第三步中,我根据z值删除点,但我的函数真的很慢。
1.导入使用pandas从.csv文件导入数据。导入的数据框'df'包含X、Y、Z的数据。例如:df的形状为[300,1001]。则X是df的前三分之一。X = df.iloc[:99,1:],Y为df.iloc[100:199,1:],依此类推。第一列(索引)是不相关的。X、Y、Z中的一行对应于单次扫描的数据。
1.转换为NumPy数据框'df'包含许多空字段''。因此,我将数据结构更改为形状为(N,3)的NumPy数组“A”,其中每行表示一个点。将删除包含空值的所有点。
1.根据最大值删除点。扫描高度。我只对每次扫描中略低于最大值的点感兴趣。我使用我的函数'in_max_height'来创建允许范围内所有点的掩码。
下面是我的代码:
def in_max_height(A,hMax):
# get unique x values
unique_x = np.unique(A[:,0])
# create an empty mask array with the same shape as A
mask = np.zeros_like(A[:,2], dtype=bool)
# iterate over unique x and find the max. z-value
for x in unique_x:
zMax = np.max(A[A[:,0] == x, 2])
mask[A[:,0] == x] = ~(A[A[:,0] == x, 2] < zMax - hMax)
return mask
A = A[in_max_height(A,hMax=1)] # apply max. layer height
1.分析创建各种图...
我试图在第1步之后删除 * 低点 *,但我不知道如何忽略dataframe的索引列。
现在,平均点云由大约375,000个点组成,我的函数大约需要11秒才能完成。我想学习如何从根本上解决这些大数据问题。
1条答案
按热度按时间bfrts1fy1#
我承认我的代码不是最优的,但它的工作速度比我的笔记本电脑上的11s快: