假设我有一个 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/