向量化 NumPy 时遇到问题
Trouble vectoring a NumPy
我正在尝试为使用 LIDAR 的学校项目编写一些高效的代码。目标是过滤掉点云中超过10米的点云中的任何东西并传递出去。我可以编写一个 for 循环来执行此操作,但它不是很优化。我的目标是使用 NumPy 高效地实现这一点。
def get_distance(input_array):
return np.sqrt(np.sum(np.square(input_array)))
def filter_by_distance(cloud, distance=10):
cloud1 = [item for item in cloud if get_distance(item) <= distance]
return np.asarray(cloud1)
云是一个多维 np.array 包含 [X,Y,Z,I]
[[23.157 0.032 0.992 0.34 ]
[23.219 0.105 0.994 0.29 ]
[23.282 0.179 0.996 0.26 ]
...
[ 1.548 -1.101 -0.77 0. ]
[ 1.388 -0.978 -0.676 0. ]
[ 1.42 -0.964 -0.684 0. ]]
我正在使用 get_distance(cloud[:,0:2]) 获取 x,y 距离,但我似乎找不到使用此 trim 的方法没有 for 循环的原始点云。如果有任何帮助,我将不胜感激!
你快到了。您可以添加或省略 z,我不确定我代表什么。
points = cloud[:,0:3]
points = np.sqrt(np.sum(np.square(points), axis=1))
points_filtered = points[points<=distance]
添加的是一个轴,用于沿每个点的 x、y 和 z 值求和,并在 numpy 中包含过滤。 points<=distance
returns 用作掩码的布尔数组。
您可以将 True
False
布尔值的索引(或掩码)作为选择标准传递给 ndarray。使用您显示的方法获取与原点的距离。只需将其展开以按行对云阵列进行操作。请参阅 sum documentation 并查看 axis
。您需要每一行的总和,因为您已经将数据存储为一个 X、Y、Z、I 作为一行。如果您将来转置它,请对列使用 axis = 0。
dist = np.sqrt(np.sum(np.square(cloud[:,0:2]), axis = 1))
这将为您提供与点云中的点数一样长的距离向量。现在创建索引:
index = dist <= 10
如果您打印此索引,您将看到一系列 True
False
。现在进行过滤
filtered_cloud = cloud[index,:]
当然,还有丑陋的一行字。如果您这样做...请发表评论,以便人们知道您做了什么。
filtered_cloud = cloud[np.sqrt(np.sum(np.square(cloud[:,0:2]), axis = 1)) <= 10, :]
奇怪,为什么只使用 x 和 y 作为距离?
计算平方内行之和,无需sqrt,直接与平方距离比较
def filter_by_distance(cloud, distance=10):
# np.sum is implemented c and very fast
# axis = 1 for summing row
# no need to sqaure root (save computation)
# : stand for row, 0:3 stand for column 0, 1, 2
umask = np.sum(cloud[:, 0:3]**2, axis=1) < distance**2
# umask is boolean array, whereever it is false, that cloud point will not be shown
return cloud[umask]
我正在尝试为使用 LIDAR 的学校项目编写一些高效的代码。目标是过滤掉点云中超过10米的点云中的任何东西并传递出去。我可以编写一个 for 循环来执行此操作,但它不是很优化。我的目标是使用 NumPy 高效地实现这一点。
def get_distance(input_array):
return np.sqrt(np.sum(np.square(input_array)))
def filter_by_distance(cloud, distance=10):
cloud1 = [item for item in cloud if get_distance(item) <= distance]
return np.asarray(cloud1)
云是一个多维 np.array 包含 [X,Y,Z,I]
[[23.157 0.032 0.992 0.34 ]
[23.219 0.105 0.994 0.29 ]
[23.282 0.179 0.996 0.26 ]
...
[ 1.548 -1.101 -0.77 0. ]
[ 1.388 -0.978 -0.676 0. ]
[ 1.42 -0.964 -0.684 0. ]]
我正在使用 get_distance(cloud[:,0:2]) 获取 x,y 距离,但我似乎找不到使用此 trim 的方法没有 for 循环的原始点云。如果有任何帮助,我将不胜感激!
你快到了。您可以添加或省略 z,我不确定我代表什么。
points = cloud[:,0:3]
points = np.sqrt(np.sum(np.square(points), axis=1))
points_filtered = points[points<=distance]
添加的是一个轴,用于沿每个点的 x、y 和 z 值求和,并在 numpy 中包含过滤。 points<=distance
returns 用作掩码的布尔数组。
您可以将 True
False
布尔值的索引(或掩码)作为选择标准传递给 ndarray。使用您显示的方法获取与原点的距离。只需将其展开以按行对云阵列进行操作。请参阅 sum documentation 并查看 axis
。您需要每一行的总和,因为您已经将数据存储为一个 X、Y、Z、I 作为一行。如果您将来转置它,请对列使用 axis = 0。
dist = np.sqrt(np.sum(np.square(cloud[:,0:2]), axis = 1))
这将为您提供与点云中的点数一样长的距离向量。现在创建索引:
index = dist <= 10
如果您打印此索引,您将看到一系列 True
False
。现在进行过滤
filtered_cloud = cloud[index,:]
当然,还有丑陋的一行字。如果您这样做...请发表评论,以便人们知道您做了什么。
filtered_cloud = cloud[np.sqrt(np.sum(np.square(cloud[:,0:2]), axis = 1)) <= 10, :]
奇怪,为什么只使用 x 和 y 作为距离?
计算平方内行之和,无需sqrt,直接与平方距离比较
def filter_by_distance(cloud, distance=10):
# np.sum is implemented c and very fast
# axis = 1 for summing row
# no need to sqaure root (save computation)
# : stand for row, 0:3 stand for column 0, 1, 2
umask = np.sum(cloud[:, 0:3]**2, axis=1) < distance**2
# umask is boolean array, whereever it is false, that cloud point will not be shown
return cloud[umask]