假设我在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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句