2017-08-09 49 views
3

我想生成一个n维网格。如何在python中生成一个n维网格

对于3D网格,我有以下工作代码(产生5×5×的(-1,1)

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接受切片

+0

使用'complex'的原因是什么?随着你的3D代码,我得到3x5x5x5。这是打算? – kazemakase

+0

@kazemakase从文档:“但是,如果步长是一个复数(例如5j),那么其大小的整数部分被解释为指定在开始和停止值之间创建的点的数量,其中停止值*包含*。“。当使用非复数时,停止值是独占的。 – Evert

+1

@Evert哦,谢谢,我不知道这一点。看起来像一个模糊的功能... – kazemakase

回答

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

正如kazemakase建议,应更换“手短”切片符号step-1 : 1.0-step: complex(0,subdivision)一起slice显式调用,并且然后将其组合在“tuple发生器”中:

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

带有6D网格的结果。