我正在使用Numpy对点云文件进行一些下采样处理。在这个过程中,我使用np.unique从数组中获取唯一值计数。请注意,这是一个非常大的数组,大约有3600万个3D点。有没有其他有效的替代方法可以使用?或者我应该转换到其他数据结构来做np.unique在这里做的事情,以使过程更快?现在大概需要300秒。我知道unique已经优化了,但是有没有其他的数据结构可以用来获得更好的结果?数组只包含x,y,z格式的点。
我在下面附上我的代码片段。提前感谢您的帮助,请随时向我询问您可能需要的任何其他信息。我试着改变精度等级,但没有效果。我在Ubuntu 22.04上使用numpy 1.24.4。
import numpy as np
import time
points = np.random.random(size = (38867362,3))*10000
# print(points)
# print("points bytes:",points.nbytes)
start_time = time.time()
unique_points, inverse, counts = np.unique(((points - np.min(points, axis=0)) // 3).astype(int), axis=0, return_inverse=True, return_counts=True)
print("::INFO:: Total time taken: ", time.time()-start_time)
字符串
等等。
3条答案
按热度按时间zbq4xfa01#
你可以尝试从你的数据中创建一个集合。集合中的元素不会有任何重复。
字符串
不过,我还没有测试过这是否比你的方法快。而且,这不会给予你
np.unique()
的其他返回值。编辑
作为OP给出的一个例子,我测量了(1)
np.unique
,(2)转换到元组列表,(3)set()
的运行时间型
带输出
型
所以
set()
确实是一个选项,如果其他返回值可以丢失的话…3xiyfsfu2#
根据OP的最终目标,这是一个一维数据的解决方案(它很容易调整,只是不清楚每个维度是单独处理还是同时处理)。
字符串
slhcrj9b3#
下面是一个使用pandas
DataFrame.drop_duplicates
的版本。这很好,因为它不需要像set()
那样进行元组转换。字符串
输出为
型
这比
set()
加上元组转换快4倍!注意
df.drop_duplicates(...).index
是输入索引的子集,因此具有可比性。