多维度的numpy linspace和网格网格

Luc*_*uca 1 python matlab numpy

我正在使用numpy将一些matlab代码移植到python,我有以下matlab命令:

[xgrid,ygrid]=meshgrid(linspace(-0.5,0.5, GridSize-1), ...
                       linspace(-0.5,0.5, GridSize-1));
Run Code Online (Sandbox Code Playgroud)

现在,这在2D中很好,但我想将其扩展到n维.因此,根据输入数据,GridSize可以是2,3或4维向量.因此,在2D中,这将是:

[xgrid, grid] = np.meshgrid(np.linspace(-0.5,0.5, GridSize[0]), 
                            np.linspace(-0.5,0.5, GridSize[1]));
Run Code Online (Sandbox Code Playgroud)

但是,我之前不知道输入的维数,所以是否可以重写此表达式,以便它可以生成具有任意数量维度的网格?

Div*_*kar 5

您可以使用循环理解来生成所有1D数组,然后np.meshgrid在*内部使用的所有运算符上使用unpacking of argument lists,这相当于MATLAB's comma separated lists- 就像这样 -

allG = [np.linspace(-0.5,0.5, G) for G in GridSize]
out = np.meshgrid(*allG)
Run Code Online (Sandbox Code Playgroud)

样品运行

1)2D案例:

In [27]: GridSize = [3,4]

In [28]: allG = [np.linspace(-0.5,0.5, G) for G in GridSize]
    ...: out = np.meshgrid(*allG)
    ...: 

In [29]: out[0]
Out[29]: 
array([[-0.5,  0. ,  0.5],
       [-0.5,  0. ,  0.5],
       [-0.5,  0. ,  0.5],
       [-0.5,  0. ,  0.5]])

In [30]: out[1]
Out[30]: 
array([[-0.5       , -0.5       , -0.5       ],
       [-0.16666667, -0.16666667, -0.16666667],
       [ 0.16666667,  0.16666667,  0.16666667],
       [ 0.5       ,  0.5       ,  0.5       ]])
Run Code Online (Sandbox Code Playgroud)

2)3D案例:

In [51]: GridSize = [3,4,2]

In [52]: allG = [np.linspace(-0.5,0.5, G) for G in GridSize]
    ...: out = np.meshgrid(*allG)
    ...: 

In [53]: out[0]
Out[53]: 
array([[[-0.5, -0.5],
        [ 0. ,  0. ],
        [ 0.5,  0.5]], ...

       [[-0.5, -0.5],
        [ 0. ,  0. ],
        [ 0.5,  0.5]]])

In [54]: out[1]
Out[54]: 
array([[[-0.5       , -0.5       ], ...

       [[ 0.16666667,  0.16666667],
        [ 0.16666667,  0.16666667],
        [ 0.16666667,  0.16666667]],

       [[ 0.5       ,  0.5       ],
        [ 0.5       ,  0.5       ],
        [ 0.5       ,  0.5       ]]])

In [55]: out[2]
Out[55]: 
array([[[-0.5,  0.5], ....

       [[-0.5,  0.5],
        [-0.5,  0.5],
        [-0.5,  0.5]]])
Run Code Online (Sandbox Code Playgroud)