我正在尝试使用numpy.meshgrid来模拟3D空间,并在其中执行一些操作。首先,我需要使用某种遮罩在其中定义一个子空间,然后,我将需要计算不同点之间的各种距离。
def Projtest1(LX,LY,LZ,N,R):
xlin,dx=np.linspace(-LX/2,LX/2,N,retstep=True,dtype=float)
ylin,dy=np.linspace(-LY/2,LY/2,N,retstep=True,dtype=float)
zlin,dz=np.linspace(-LZ/2,LZ/2,N,retstep=True,dtype=float)
X,Y,Z=np.meshgrid(xlin,ylin,zlin,indexing='ij')
mask=(X)**2+(Y)**2+(Z)**2
Cmask=mask<R**2
Cmask=Cmask.astype(int,'copy=False')
XC=X
XC=np.multiply(X,Cmask)
YC=np.multiply(Y,np.where(False,Y,Cmask.astype(int)))
ZC=np.multiply(Z,np.where(False,Z,Cmask.astype(int)))
print (np.shape(XC))
print (np.shape(Cmask))
print(X[2][2][2]*Cmask,Cmask[2][2][2],X[2][2][2])
return Cmask, XC, X # YC, ZC
我的问题之一是,当我运行这段代码时,在任何给定的矩阵XC YC ZC上,我只会得到所需空间的一部分。
Projtest1(100,100,100,5,50)
Cmask
(array([[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]],
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]])
和XC,子空间的遮罩X坐标应该是什么
array([[[ -0., -0., -0., -0., -0.],
[ -0., -0., -0., -0., -0.],
[ -0., -0., -0., -0., -0.],
[ -0., -0., -0., -0., -0.],
[ -0., -0., -0., -0., -0.]],
[[ -0., -0., -0., -0., -0.],
[ -0., -25., -25., -25., -0.],
[ -0., -25., -25., -25., -0.],
[ -0., -25., -25., -25., -0.],
[ -0., -0., -0., -0., -0.]],
[[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]],
[[ 0., 0., 0., 0., 0.],
[ 0., 25., 25., 25., 0.],
[ 0., 25., 25., 25., 0.],
[ 0., 25., 25., 25., 0.],
[ 0., 0., 0., 0., 0.]],
[[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]]]))
对此我感到困惑,并且不确定是某种索引不匹配还是类型错误。我对使用numpy相当陌生,并且想知道meshgrid是否对我而言是错误的方法。换掉部分代码以尝试看看实际发生的事情,使代码有些混乱
任何和所有输入都将有所帮助,让我知道我需要提供任何其他信息。谢谢!
编辑:我希望第二个显示的XC数组在所有显示的第一个显示的Cmask数组为= 1(或True,如果更好的是bool)的位置上传递值。您会看到,在XC矩阵的第三个切片上,该切片对应于X = 0平面,尽管那里的遮罩为正,但没有携带任何值。在YC和ZC中也会发生此问题。