如何在迭代NumPy数组时提高性能?

k7fdbhmy  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(188)

我在分析激光扫描仪生成的大量点云数据。在第三步中,我根据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秒才能完成。我想学习如何从根本上解决这些大数据问题。

bfrts1fy

bfrts1fy1#

我承认我的代码不是最优的,但它的工作速度比我的笔记本电脑上的11s快:

import random
import numpy as np
import time

def get_random_point():
    i = 1950
    return (random.randint(0, i), random.randint(0, i),  random.randint(0, i/10))

# Construct test array with 375000 points and 1950 unique values
test_array = np.array([get_random_point() for x in range(375000)],dtype=np.int64)
print(test_array.shape)
(375000, 3)

start = time.time()
# Sort on first and last column decreasing order
tsorted =  test_array[np.lexsort((test_array[:,2], test_array[:,0]))][::-1]

res = []
u = tsorted[0][0]
z_max = tsorted[0][2]
hmax = 1
for x in tsorted:
    if x[0] != u or not res:
        
        u = x[0]
        z_max = x[2]
        res.append(x)
    else:
        if x[2] + hmax >= z_max:
            res.append(x)
res = np.array(res)
print(time.time() - start)
# in secs
0.47696924209594727

相关问题