Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 给定XYZ网格点,计算球体内部的体积_Python_Numpy_Scipy - Fatal编程技术网

Python 给定XYZ网格点,计算球体内部的体积

Python 给定XYZ网格点,计算球体内部的体积,python,numpy,scipy,Python,Numpy,Scipy,我有一个由均匀分布的xyz笛卡尔点组成的大型3D网格(~800000点),我想根据占据球体的点的数量来计算球体内部的体积。我目前正在使用scipy cKDTree,并使用查询球点检测原点(0,0,0)某个半径内的所有点来估计体积,但该体积(网格体积,如下)通常与真实体积(球体体积)相差很大(误差为50%或更大) 在这种情况下: grid_vol = 78.1275 sphere_vol = 179.5944 我想知道是否有一个已知的模块适用于从网格点测量球体的应用程序嘿,guilian我尝试了

我有一个由均匀分布的xyz笛卡尔点组成的大型3D网格(~800000点),我想根据占据球体的点的数量来计算球体内部的体积。我目前正在使用scipy cKDTree,并使用查询球点检测原点(0,0,0)某个半径内的所有点来估计体积,但该体积(网格体积,如下)通常与真实体积(球体体积)相差很大(误差为50%或更大)

在这种情况下:

grid_vol = 78.1275
sphere_vol = 179.5944

我想知道是否有一个已知的模块适用于从网格点测量球体的应用程序

嘿,guilian我尝试了你的代码,据我所知,它工作得很好(由于近似而出现一些错误,但不是很大的错误)

import numpy as np
from scipy import spatial
#define constants
l=-1
r=1
spacing=0.05
R=0.5
cube = spacing ** 3  
#Create grid
x=np.arange(l,r,spacing)
y=np.arange(l,r,spacing)
z=np.arange(l,r,spacing)
x2,y2,z2=np.meshgrid(x,y,z,indexing='ij')
all_grid=np.array([x2.flatten(),y2.flatten(),z2.flatten()]).T
# your code            
point_tree = spatial.cKDTree(all_grid)
n_voxel = len(point_tree.query_ball_point((0,0,0), R))   # number of points in grid occupying sphere of radius R
grid_vol = n_voxel * cube                               # volume based on grid points
sphere_volume = 4 / 3 * np.pi * R ** 3
print(grid_vol) # 0.5185000000000001
print(sphere_volume) # 0.5235987755982988

“大不一样”是什么意思?多少?从连续空间到体素化空间时,如果试图减少50%或更大的错误,您将始终丢失信息。谢谢,我认为代码对于较小的半径和更少的点通常可以正常工作,但我已更新了我的问题,以显示我通常使用的大小以及我可以得到的错误类型。在查看我的问题又来了,我发现我要测量的球体并没有被网格完全封装,所以我甚至无法准确地测量球体……无论如何,感谢您的关注。
import numpy as np
from scipy import spatial
#define constants
l=-1
r=1
spacing=0.05
R=0.5
cube = spacing ** 3  
#Create grid
x=np.arange(l,r,spacing)
y=np.arange(l,r,spacing)
z=np.arange(l,r,spacing)
x2,y2,z2=np.meshgrid(x,y,z,indexing='ij')
all_grid=np.array([x2.flatten(),y2.flatten(),z2.flatten()]).T
# your code            
point_tree = spatial.cKDTree(all_grid)
n_voxel = len(point_tree.query_ball_point((0,0,0), R))   # number of points in grid occupying sphere of radius R
grid_vol = n_voxel * cube                               # volume based on grid points
sphere_volume = 4 / 3 * np.pi * R ** 3
print(grid_vol) # 0.5185000000000001
print(sphere_volume) # 0.5235987755982988