【问题标题】:numpy linspace and mesh grid for multiple dimensions用于多个维度的 numpy linspace 和网格网格
【发布时间】:2016-03-15 18:48:11
【问题描述】:

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

[xgrid,ygrid]=meshgrid(linspace(-0.5,0.5, GridSize-1), ...
                       linspace(-0.5,0.5, GridSize-1));

现在,这在 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]));

但是,我之前不知道输入的维度,所以是否可以重写这个表达式,使其可以生成任意维度的网格?

【问题讨论】:

  • 您是否尝试过添加一个昏迷和另一个 linspace?
  • 是的,但关键是在“编译时”尺寸是未知的......它必须根据输入 GridSize 向量的尺寸生成。
  • 您的 MATLAB 代码对两个维度使用相同的大小,而您的 numpy 代码则不是。目的是什么?
  • 即使 Matlab 代码不使用相同的大小。
  • @Luca 如果他们不知道,放一个 if 语句.....另外,在 matlab 中,任何矩阵都有无限维大小 1,所以你可以只添加单点的 alinspace。跨度>

标签: python matlab numpy


【解决方案1】:

您可以使用循环解析来生成所有一维数组,然后对所有具有* 运算符的数组使用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)

样本运行

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       ]])

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]]])

【讨论】:

  • 成功了。我想使用列表理解,但错过了* 运算符,无法理解我的错误。谢谢!
  • @Luca 不用担心,很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2023-03-21
  • 2018-02-01
相关资源
最近更新 更多