如何在python中生成n维网格

时间:2017-08-09 06:38:40

标签: python numpy

我想生成一个n维网格。

对于3D网格,我有以下工作代码(在(-1,1)之间创建一个5X5X5的网格

import numpy as np
subdivision = 5
step = 1.0/subdivision
grid= np.mgrid[ step-1 : 1.0-step: complex(0, subdivision),
                step-1 : 1.0-step: complex(0, subdivision),
                step-1 : 1.0-step: complex(0, subdivision)]

我想将此概括为n维 像

这样的东西
grid = np.mgrid[step-1 : 1.0-step: complex(0,subdivision) for i in range(n)]

但这显然不起作用。 我也试过

temp = [np.linspace(step-1 , 1.0-step, subdivision) for i in range(D)]
grid = np.mgrid[temp]

但是,由于np.mgrid接受切片

,因此无法正常工作

3 个答案:

答案 0 :(得分:4)

您可以使用实数明确定义步长,而不是使用complex。在我看来,这更简洁:

grid= np.mgrid[ step-1 : 1.0: step * 2,
                step-1 : 1.0: step * 2,
                step-1 : 1.0: step * 2]

在解析上面的代码段后,我们看到step-1 : 1.0: step * 2定义了一个切片,并将它们分隔为,会创建一个包含三个切片的元组,并将其传递给np.mgrid.__getitem__

我们可以通过构建n切片的元组将其推广到n维度:

n = 3
grid= np.mgrid[tuple(slice(step - 1, 1, step * 2) for _ in range(n))]

答案 1 :(得分:1)

根据kazemakase的建议,您应该使用slice的显式调用替换“短手”切片符号step-1 : 1.0-step: complex(0,subdivision),然后将其合并为“tuple发生器“:

D = 6
grid = np.mgrid[tuple(slice(step-1, 1.0-step, complex(0,subdivision)) for i in range(D))]

使用6D网格的结果。

答案 2 :(得分:0)

您可以使用meshgridlinspace来做您想做的事。

import numpy as np
X1, X2, X3 = np.meshgrid(*[np.linspace(-1,1,5),
                           np.linspace(-1,1,5),
                           np.linspace(-1,1,5)])

对于许多维度,您可以

D = 4
subdivision = 5
temp = [np.linspace(-1.0 , 1.0, subdivision) for i in range(D)]
res_to_unpack = np.meshgrid(*temp)
assert(len(res_to_unpack)==D)