Numpy Masking和Meshgrid提供令人困惑的输出

时间:2018-12-07 05:15:06

标签: python numpy

我正在尝试使用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中也会发生此问题。

0 个答案:

没有答案