不確定之前是否有人問過這個問題——我查看了類似的例子,但它們并不是我需要做的。
我在一個立方體中有一個位置陣列(形狀 = (8855470, 3)),物理坐標在 0 到 787.5 之間。這些位置代表某些空間中的點質量。下面是這個陣列的前三個條目:
array([[224.90635586, 720.494766 , 19.40263367],
[491.25279546, 41.26026654, 7.35436416],
[407.70436788, 340.32618713, 328.88192913]])
我想把這個巨大的立方體分成一些更小的立方體。例如,如果我想將它的每一邊分成 10 個立方體,總共有 1,000 個子立方體,那么每個子立方體將只包含在該子立方體中具有位置的點。我一直在試驗 np.meshgrid 來創建必要的 3D 網格,以便有條件地將位置陣列的適當條目分配給子立方體:
split = np.arange(0.,(787.5 787.5/10.),step=787.5/10.)
xg,yg,zg = np.meshgrid(split,split,split,indexing='ij')
但我不確定這是否是解決此問題的方法。如果這個問題太模糊或者您需要任何其他資訊,請告訴我。
uj5u.com熱心網友回復:
為了解決問題,我將使用玩具資料。我想你已經接近網格了。這是一個提案
- 創建網格,但不包括 757.5 之前的點,值與您在 arange 中所做的一樣。
- 重塑然后有一個 1d_array。用于陣列 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 個元素的串列,其中每個元素都是一個包含Nx3點串列的 sub_cube 。如果您想恢復與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')
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367991.html
上一篇:單擊時如何使精靈消失?
