首页 文章

将点 Cloud 划分为python中的象限

提问于
浏览
3

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

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

我想把这些点分成八个象限,参考点 Cloud 的“质心” . 我可以这样做:

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

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

1 回答

  • 3

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

    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))
    

相关问题