为了解决问题,我将使用玩具数据。我认为您在网格附近。这是一个建议
- 创建网格,但不包括直到 757.5 的点,其值与您在 arange 中所做的一样。
- 然后重新整形以获得 1d_array。 for in arrays zip 以获取立方体形状的掩码。
- 创建一个列表来保存所有子立方体点。
import numpy as np
data = np.random.randint(0,787,( 10000,3))
start = 0
end = 787.5
step = (end-start)/10
split = np.arange(start,end,step)
xg,yg,zg = np.meshgrid(split,split,split,indexing='ij')
xg = xg.reshape(-1)
yg = yg.reshape(-1)
zg = zg.reshape(-1)
subcube_data = []
for x,y,z in zip(xg,yg,zg):
mask_x = (x<= data[:,0] ) * ( data[:,0] < x+step) #data_x between start and end for this subcube
mask_y = (y<= data[:,1] ) * ( data[:,1] < y+step) #data_y between start and end for this subcube
mask_z = (z<= data[:,2] ) * ( data[:,2] < z+step) #data_z between start and end for this subcube
mask = mask_x * mask_y * mask_z
subcube_data.append(data[mask])
现在您将拥有一个包含 1000 个元素的列表,其中每个元素都是一个 sub_cube,其中包含一个 Nx3 点列表。如果你想恢复每个 sub_cube[i] 对应的 3d 索引,你可以做 [xg[i],yg[i],zg[i]]。
最后你可以绘制查看一些 sub_cubes 和其余数据
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#plot data as 3d scatter border black
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#plot subcubes 0 1 2 3 4 in colors
for i in range(5):
ax.scatter(subcube_data[i][:,0],
subcube_data[i][:,1],
subcube_data[i][:,2], marker='o', s=2)
for i in range(5,len(subcube_data)):
ax.scatter(subcube_data[i][:,0],
subcube_data[i][:,1],
subcube_data[i][:,2],marker='o', s=1, color='black')