NumPy unique() returns 超出范围的索引
NumPy unique() returns indices that are out-of-bounds
我正在尝试从点云中删除彼此距离太近的点。我的输入是一个 mx3 矩阵,其中列代表 xyz 坐标。代码如下:
def remove_duplicates(points, threshold):
# Convert to numpy
points = np.array(points)
# Round to within the threshold
rounded_points = points
if threshold > 0.0:
rounded_points = np.round(points/threshold)*threshold
# Remove duplicate points
point_tuples = [tuple(point) for point in rounded_points]
unique_rounded_points, unique_indices = np.unique(point_tuples, return_index = True)
points = points[unique_indices]
return points
我 运行 遇到的问题是 unique_indices 包含的值大于点的长度(我的测试数据为 2265 和 1000)。我做错了什么,还是 NumPy 中的错误?
编辑:我应该注意,对于非常小的输入(尝试了 27 个点),unique() 似乎可以正常工作。
既然前面的程序可以运行,那么我建议你有一个重叠问题:NumPy 在右侧访问 points 而在左侧更改它。使用不同的变量名
orig_points = points[unique_indices]
return orig_points
或者直接return它
return points[unique_indices]
所以 points
是一个二维数组,(m,3)
的形状,对吧?
point_tuples
是元组列表,即 rounded_points
的行现在是 3 个浮点数的元组。
np.unique
将把它变成一个数组来完成它的事情
np.array(point_tuples)
是一个 (m,3)
数组(同样是 2d,如 points
)。元组什么也没做。
unique
将作用于这个数组的拼合形式,因此 unique_indices
的值可以在 0 到 3*m 之间。因此你的错误。
我看到 2 个问题 - 如果你想 unique
找到唯一的 'rows',你需要制作一个结构化数组
np.array(point_tuples, 'f,f,f')
将 unique
应用于浮动也很棘手。几乎不可能找到 2 个相等的浮点数。四舍五入减少了这个问题,但没有消除它。
因此,以 rounded_points
为整数数组的方式使用 round 可能更好。这些值不需要缩减以匹配 points
.
如果需要,我可以添加示例,但请先尝试这些建议。我对你的数据做出了很多猜测,我想在继续之前得到一些反馈。
我正在尝试从点云中删除彼此距离太近的点。我的输入是一个 mx3 矩阵,其中列代表 xyz 坐标。代码如下:
def remove_duplicates(points, threshold):
# Convert to numpy
points = np.array(points)
# Round to within the threshold
rounded_points = points
if threshold > 0.0:
rounded_points = np.round(points/threshold)*threshold
# Remove duplicate points
point_tuples = [tuple(point) for point in rounded_points]
unique_rounded_points, unique_indices = np.unique(point_tuples, return_index = True)
points = points[unique_indices]
return points
我 运行 遇到的问题是 unique_indices 包含的值大于点的长度(我的测试数据为 2265 和 1000)。我做错了什么,还是 NumPy 中的错误?
编辑:我应该注意,对于非常小的输入(尝试了 27 个点),unique() 似乎可以正常工作。
既然前面的程序可以运行,那么我建议你有一个重叠问题:NumPy 在右侧访问 points 而在左侧更改它。使用不同的变量名
orig_points = points[unique_indices]
return orig_points
或者直接return它
return points[unique_indices]
所以 points
是一个二维数组,(m,3)
的形状,对吧?
point_tuples
是元组列表,即 rounded_points
的行现在是 3 个浮点数的元组。
np.unique
将把它变成一个数组来完成它的事情
np.array(point_tuples)
是一个 (m,3)
数组(同样是 2d,如 points
)。元组什么也没做。
unique
将作用于这个数组的拼合形式,因此 unique_indices
的值可以在 0 到 3*m 之间。因此你的错误。
我看到 2 个问题 - 如果你想 unique
找到唯一的 'rows',你需要制作一个结构化数组
np.array(point_tuples, 'f,f,f')
将 unique
应用于浮动也很棘手。几乎不可能找到 2 个相等的浮点数。四舍五入减少了这个问题,但没有消除它。
因此,以 rounded_points
为整数数组的方式使用 round 可能更好。这些值不需要缩减以匹配 points
.
如果需要,我可以添加示例,但请先尝试这些建议。我对你的数据做出了很多猜测,我想在继续之前得到一些反馈。