Python 如何在阵列内创建球体?

Python 如何在阵列内创建球体?,python,numpy,Python,Numpy,我有一个大小为32x32x32的数据阵列。我想在数组中创建一个球体,其中心位于(x,y),半径为4像素。球体的值为1,而数组的值为0。如何在python中实现这一点 以下是生成数组的代码: import numpy as np A = np.zeros((32,32,32)) print (A) 很好的问题。您可以尝试以下代码。在下面提到的代码中,AA是您想要的矩阵。=) 我没有打印您要求的大小和半径的输出(size=32和radius=4),因为输出将非常长 由于数组索引只有一定程度的特殊性

我有一个大小为32x32x32的数据阵列。我想在数组中创建一个球体,其中心位于
(x,y)
,半径为4像素。球体的值为1,而数组的值为0。如何在python中实现这一点

以下是生成数组的代码:

import numpy as np
A = np.zeros((32,32,32))
print (A)

很好的问题。您可以尝试以下代码。在下面提到的代码中,AA是您想要的矩阵。=)


我没有打印您要求的大小和半径的输出(
size=32
radius=4
),因为输出将非常长

由于数组索引只有一定程度的特殊性(即,您只能细分到宽度,在本例中为32),因此没有一种完美的方法来表示数组中的球体。相反,我们可以将每个数组索引视为立方面积空间,其中索引的
[x][y][z]
索引表示立方面积的中心坐标。为了创建球体,我们评估球体在该空间区域中的存在是否符合某些标准

我们从球体的方程开始。发件人:

在解析几何中,具有中心(x0,y0,z0)和半径r的球体是所有点(x,y,z)的轨迹,因此


(x-x0)^2+(y-y0)^2+(z-z0)^2使用索引、距离计算和掩蔽的组合(均带有
numpy
):


以上内容对我都不起作用,因此我尝试:

def create_bin_球体(arr_大小,中心,r):
coords=np.ogrid[:arr_size[0],:arr_size[1],:arr_size[2]]
距离=np.sqrt((坐标[0]-中心[0])**2+(坐标[1]-中心[1])**2+(坐标[2]-中心[2])**2)

返回1*(距离尽管有点晚了-我最近遇到了同样的问题,并解决了它,有点像Mstaino假设的解决方案。此外,Mstainos解决方案不适用于不对称大小的阵列,因为计算距离时形状不匹配

下面是我在3D中的方法,它在数组的中心生成一个球体:

# define array size and sphere radius
size = [size_x, size_y, size_z]
radius = sphere_radius

# compute center index of array
center = [int(size[0]/2), int(size[1]/2), int(size[2]/2)]

# create index grid for array
ind_0, ind_1, ind_2 = np.indices((size[0], size[1], size[2]))

# calculate "distance" of indices to center index
distance = ((ind_0 - center[0])**2 + (ind_1 - center[1])**2 + (ind_2 - center[2])**2)**.5

# create output
output = np.ones(shape = (size[0], size[1], size[2])) * (distance <= radius)
#定义数组大小和球体半径
大小=[大小x,大小y,大小z]
半径=球体半径
#计算数组的中心索引
中心=[int(大小[0]/2)、int(大小[1]/2)、int(大小[2]/2]
#为数组创建索引网格
ind_0,ind_1,ind_2=np.索引((大小[0],大小[1],大小[2]))
#计算指数到中心指数的“距离”
距离=((ind_0-中心[0])**2+(ind_1-中心[1])**2+(ind_2-中心[2])**2)***5
#创建输出

输出=np.ones(形状=(大小[0],大小[1],大小[2])*(距离你说的“立方体(圆)”是什么意思?立方体不是圆。你想要圆(2D)还是球体(3D)?请阅读并遵循帮助文档中的发布指南,如您创建此帐户时所建议的,并在此处应用。例如,请给出一个您想要的示例,并发布您的编码尝试。尝试一下如何?您只需在以(x,y,z)为中心的8x8x8立方体上迭代即可而不是整个阵列…可能是“.该立方面积的球体比例是否大于50%”的副本一个有趣的想法。如果你考虑每个数据点一个立方体,那么你可以测试它的中心是否在球体内。这应该是这样做的——至少对于大于单个立方体的球体来说。@ Ur2525301点立方体在球体内部的中心不能保证立方体内占据的面积大于50%。方法是一个很好的近似值,我认为50%的比较在某些方面更令人满意。但我认为区别在于数组索引所代表的角度:立方面积测量,或这些立方面积的中心点。我在思考时,你的论点似乎是基于数组索引是中心的坐标请注意,这将生成一个正方形,而不是一个球体,因为曼哈顿距离(l1范数)用于
deb=radius-abs(x0-x)-abs(y0-y)-abs(z0-z)
。如果您将这行代码更改为:
deb=radius-((x0-x)**2+(y0-y)**2+(z0-z)**2),则代码有效**0.5,使用欧几里德距离(l2范数)。
[[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0.]
  [0. 1. 1. 1. 0.]
  [0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 1. 0. 0.]
  [0. 1. 1. 1. 0.]
  [1. 1. 1. 1. 1.]
  [0. 1. 1. 1. 0.]
  [0. 0. 1. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0.]
  [0. 1. 1. 1. 0.]
  [0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 1. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]]
import numpy as np
center = (31/2, 31/2, 31/2)  # if it is centered
size = (32, 32, 32)
max_dist = 4
distance = np.linalg.norm(np.subtract(np.indices(size).T, np.asarray(center)), axis=2)
#print(distance)
mask = np.ones(size) * (distance < max_dist)
print(mask)
center = (1, 1, 1)
size = (3, 3, 3)
distance = np.linalg.norm(np.subtract(np.indices(size).T,np.asarray(center)), axis=len(center))
mask = np.ones(size) * (distance<=1)
print(mask)

>>[[[0. 0. 0.]
  [0. 1. 0.]
  [0. 0. 0.]]

 [[0. 1. 0.]
  [1. 1. 1.]
  [0. 1. 0.]]

 [[0. 0. 0.]
  [0. 1. 0.]
  [0. 0. 0.]]]
# define array size and sphere radius
size = [size_x, size_y, size_z]
radius = sphere_radius

# compute center index of array
center = [int(size[0]/2), int(size[1]/2), int(size[2]/2)]

# create index grid for array
ind_0, ind_1, ind_2 = np.indices((size[0], size[1], size[2]))

# calculate "distance" of indices to center index
distance = ((ind_0 - center[0])**2 + (ind_1 - center[1])**2 + (ind_2 - center[2])**2)**.5

# create output
output = np.ones(shape = (size[0], size[1], size[2])) * (distance <= radius)