更短,更快和更清晰的答案,避免使用网格:
import numpy as npdef func(x, y): return np.sin(y * x)xaxis = np.linspace(0, 4, 10)yaxis = np.linspace(-1, 1, 20)result = func(xaxis[:,None], yaxis[None,:])
如果您将x ^ 2 + y之类的函数用作函数,则在内存中的存储速度会更快,因为x ^ 2比1D数组(而不是2D数组)更复杂,并且只有在执行“
+”。对于meshgrid,x ^ 2将在2D数组上完成,其中基本上每一行都是相同的,这会导致大量的时间增加。
编辑:“ x [:,None]”,使x成为2D数组,但第二维为空。此“无”与使用“ x
[:,numpy.newaxis]”相同。Y可以完成相同的操作,但是要创建一个空的第一维。
编辑:3维:
def func2(x, y, z): return np.sin(y * x)+zxaxis = np.linspace(0, 4, 10)yaxis = np.linspace(-1, 1, 20)zaxis = np.linspace(0, 1, 20)result2 = func2(xaxis[:,None,None], yaxis[None,:,None],zaxis[None,None,:])
这样,您就可以轻松地扩展到N维,如果你愿意的话,使用尽可能多
None或
:作为你的尺寸。每个都有
:一个维度,每个都有
None一个“空”维度。下一个示例显示了更多这些空白尺寸的工作方式。如您所见,如果使用
None,形状会发生变化,在下一个示例中表明它是3D对象,但是只有当您乘以实际上具有这些尺寸中某些内容的对象时,空白尺寸才会被填充(听起来很复杂,但是下一个例子显示了我的意思)
In [1]: import numpyIn [2]: a = numpy.linspace(-1,1,20)In [3]: a.shapeOut[3]: (20,)In [4]: a[None,:,None].shape Out[4]: (1, 20, 1)In [5]: b = a[None,:,None] # this is a 3D array, but with the first and third dimension being "empty"In [6]: c = a[:,None,None] # same, but last two dimensions are "empty" hereIn [7]: d=b*cIn [8]: d.shape # only the last dimension is "empty" hereOut[8]: (20, 20, 1)
编辑:无需自己输入None
def ndm(*args): return [x[(None,)*i+(slice(None),)+(None,)*(len(args)-i-1)] for i, x in enumerate(args)]x2,y2,z2 = ndm(xaxis,yaxis,zaxis)result3 = func2(x2,y2,z2)
这样,通过将
Nonendm的第一个参数作为第一个完整尺寸,将第二个作为第二个完整尺寸,以此类推,从而创建了额外的空尺寸,它的作用与“硬编码”相同之前使用的语法。
简短说明:做
x2, y2, z2 = ndm(xaxis, yaxis, zaxis)与做相同
x2 = xaxis[:,None,None]y2 = yaxis[None,:,None]z2 = zaxis[None,None,:]
但是ndm方法也应该适用于更大的维度,而无需
None像上面显示的那样多行对-
slice进行硬编码。这也将在1.8之前的numpy版本中工作,而numpy.meshgrid仅在numpy 1.8或更高版本中才适用于2维以上的尺寸。