假设我有一个由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
当然,这个函数可以正常工作。它返回一个包含八个位置坐标数组的列表,每个数组只包含落在特定象限中的点。但我觉得应该有更清晰、更简洁的方法来处理这个问题。您有什么建议吗?
np.packbits(b > 0.0, axis=1) >> 5
。它会将象限标记为0-7,但可能不是所需的顺序。 - user2379410