python - 在python中将点云划分为象限

标签 python arrays numpy

假设我有一个 3 维 30 个点的数组,在 python 中转换为 numpy 数组:

import numpy as np
b = np.round(np.random.random((30,3))*20)
b = b - b.mean(axis=0)

我想引用点云的“质心”将这些点分成八个象限。我可以这样做:

for a in (b, -b):
    q_list = a[a[:,0]>0.][a[a[:,0]>0.][:,1]>0][a[a[:,0]>0.][a[a[:,0]>0.][:,1]>0][:,2]>0]
    quad_list.append(q_list * sign)
    q_list = a[a[:,0]>0.][a[a[:,0]>0.][:,1]>0][a[a[:,0]>0.][a[a[:,0]>0.][:,1]>0][:,2]<=0]
    quad_list.append(q_list * sign)             
    q_list = a[a[:,0]>0.][a[a[:,0]>0.][:,1]<=0][a[a[:,0]>0.][a[a[:,0]>0.][:,1]<=0][:,2]>0]
    quad_list.append(q_list * sign)              
    q_list = a[a[:,0]>0.][a[a[:,0]>0.][:,1]<=0][a[a[:,0]>0.][a[a[:,0]>0.][:,1]<=0][:,2]<=0]
    quad_list.append(q_list * sign)
    sign *= -1

当然,这很好用。它返回一个包含八个位置坐标数组的列表,每个数组仅包含位于特定象限中的点。但是我觉得应该有更清晰、更简洁的方法来处理这个问题。有什么建议吗?

最佳答案

这是一个递归的解决方案。它应该适用于任意数量的维度。

import numpy as np

def split_into_quadrants(points, idx=0):
    if idx < points.shape[-1]:
        positive = points[points[:, idx] >= 0]
        negative = points[points[:, idx] < 0]
        return (split_into_quadrants(positive, idx+1) +
                split_into_quadrants(negative, idx+1))
    else:
        return [points]

b = np.round(np.random.random((30,3))*20)
b = b - b.mean(axis=0)
print(split_into_quadrants(b))

关于python - 在python中将点云划分为象限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379420/

相关文章:

python3 path.join类型错误

python - Numpy dot 对对称乘法太聪明了

python - 修剪 numpy 数组中值的部分

python - 我如何在 python 中处理大数据流?

python - 是否有任何使用 TensorFlow 实现的异常检测算法的示例?

python - 获取标准库模块列表?

arrays - AngularJS Bootstrap-ui 选项卡用于提取动态内容

javascript - 在数组javascript中的每个json对象中添加新字段

python - 在Python中使用OpenCV对表示灰度图像的2D数组列表进行图像稳定

python - 在 Julia 中将整数数组转换为字符数组,反之亦然