Python中的网格工具(meshgrid mgrid ogrid ndgrid)


Answers:


82

numpy.meshgrid是根据Matlab的meshgrid命令建模的。它用于向量化两个变量的函数,以便您可以编写

x = numpy.array([1, 2, 3])
y = numpy.array([10, 20, 30]) 
XX, YY = numpy.meshgrid(x, y)
ZZ = XX + YY

ZZ => array([[11, 12, 13],
             [21, 22, 23],
             [31, 32, 33]])

因此,ZZ包含的所有组合xy投入的功能。考虑一下meshgrid,它们在广播时对于numpy数组有点多余。这意味着你可以做

XX, YY = numpy.atleast_2d(x, y)
YY = YY.T # transpose to allow broadcasting
ZZ = XX + YY

并获得相同的结果。

mgridogrid是使用索引表示法的帮助程序类,这样您就可以直接创建XXYY在前面的示例中,而不必使用linspace。生成输出的顺序相反。

YY, XX = numpy.mgrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the output of meshgrid

YY, XX = numpy.ogrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the atleast_2d example

我不熟悉scitools的内容,但ndgrid似乎等同于meshgrid,而BoxGrid实际上是一个全班级,可以帮助这类人。


感谢您的回复。但是我不明白如果我有3个(或更多)参数,应该使用什么叫x1,x2,x3!
scls 2012年

2
Meshgrid是明确的2D。其他都支持更多尺寸。这实际上可以解释ndgrid的存在。
chthonicdaemon 2012年

3
meshgrid和mgrid的结果不同。只需尝试mgrid [1:4,1:4]和meshgrid([1,2,3],[1,2,3])。
FJDU

1
在第二部分中,XX = XX.T它应该确实是YY = YY.T。如果x和y不同,这将变得很明显。
MountainX

您为什么要避免使用linspace?
曼努埃尔·佩纳

7

np.mgridnp.meshgrid()做同样的事情,但是第一和第二个轴被交换了:

# 3D
d1, d2, d3 = np.mgrid[0:10, 0:10, 0:10]
d11, d22, d33 = np.meshgrid(np.arange(10),np.arange(10),np.arange(10))
np.array_equal(d1,d11)

产量False。只需交换前两个维度:

d11 = np.transpose(d11,[1,0,2])
np.array_equal(d1,d11)

产量True

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.