更短、更快、更清晰的答案,避免使用meshgrid:
import numpy as np
def 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数组,但第二个维度为空。这个"None"相当于使用"x [:,numpy.newaxis]"。Y也是用相同的方式完成,但创建了一个空的第一维。
编辑:在3个维度中:
def func2(x, y, z):
return np.sin(y * x)+z
xaxis = 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,:])
如果您希望,可以使用尽可能多的None
或:
来扩展到 n 个维度。每个:
都会形成一个维度,而每个None
则表示一个“空”维度。下一个示例展示了这些空维度的工作方式。正如您所看到的,在下一个示例中使用None
会改变形状,但是只有在乘以实际在这些维度上具有内容的对象时,空维度才会被填充(听起来很复杂,但下一个示例会解释)。
In [1]: import numpy
In [2]: a = numpy.linspace(-1,1,20)
In [3]: a.shape
Out[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" here
In [7]: d=b*c
In [8]: d.shape # only the last dimension is "empty" here
Out[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)
这样,您可以使用None
切片来创建额外的空维度,通过将您提供给ndm的第一个参数作为第一个完整维度,第二个参数作为第二个完整维度等等- 它与之前使用的“硬编码”None
语法相同。
简短解释:执行x2,y2,z2 = ndm(xaxis,yaxis,zaxis)
与执行以下操作相同:
x2 = xaxis[:,None,None]
y2 = yaxis[None,:,None]
z2 = zaxis[None,None,:]
但是,ndm方法也适用于更多维度的操作,不需要像刚才展示的那样在多行中硬编码None
片段。这种方法也适用于1.8版本之前的numpy,而numpy.meshgrid仅适用于高于2维的情况,如果您使用的是1.8或更高版本的numpy。