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.

如果需要,我可以添加示例,但请先尝试这些建议。我对你的数据做出了很多猜测,我想在继续之前得到一些反馈。