numpy.meshgrid解释

时间:2016-09-23 14:00:24

标签: python numpy

有人可以关注meshgrid方法吗?我无法绕过它。该示例来自SciPy网站:

import numpy as np

nx, ny = (3, 2)
x = np.linspace(0, 1, nx)
print ("x =", x)

y = np.linspace(0, 1, ny)
print ("y =", y)

xv, yv = np.meshgrid(x, y)
print ("xv_1 =", xv)
print ("yv_1 =",yv)


xv, yv = np.meshgrid(x, y, sparse=True)  # make sparse output arrays
print ("xv_2 =", xv)

print ("yv_2 =", yv)

打印输出:

x = [ 0.   0.5  1. ]
y = [ 0.  1.]
xv_1 = [[ 0.   0.5  1. ]
 [ 0.   0.5  1. ]]
yv_1 = [[ 0.  0.  0.]
 [ 1.  1.  1.]]
xv_2 = [[ 0.   0.5  1. ]]
yv_2 = [[ 0.]
 [ 1.]]

为什么数组xv_1和yv_1是这样形成的? Ty:)

2 个答案:

答案 0 :(得分:4)

In [214]: nx, ny = (3, 2)
In [215]: x = np.linspace(0, 1, nx)
In [216]: x
Out[216]: array([ 0. ,  0.5,  1. ])
In [217]: y = np.linspace(0, 1, ny)
In [218]: y
Out[218]: array([ 0.,  1.])

使用解包来更好地查看由meshgrid生成的2个数组:

In [225]: X,Y = np.meshgrid(x, y)
In [226]: X
Out[226]: 
array([[ 0. ,  0.5,  1. ],
       [ 0. ,  0.5,  1. ]])
In [227]: Y
Out[227]: 
array([[ 0.,  0.,  0.],
       [ 1.,  1.,  1.]])

和稀疏版本。请注意,X1看起来像一行X(但是2d)。和Y1类似Y的一列。

In [228]: X1,Y1 = np.meshgrid(x, y, sparse=True)
In [229]: X1
Out[229]: array([[ 0. ,  0.5,  1. ]])
In [230]: Y1
Out[230]: 
array([[ 0.],
       [ 1.]])

在plus和times等计算中使用时,两种形式的行为相同。那是因为numpy's广播。

In [231]: X+Y
Out[231]: 
array([[ 0. ,  0.5,  1. ],
       [ 1. ,  1.5,  2. ]])
In [232]: X1+Y1
Out[232]: 
array([[ 0. ,  0.5,  1. ],
       [ 1. ,  1.5,  2. ]])

形状也可能有所帮助:

In [235]: X.shape, Y.shape
Out[235]: ((2, 3), (2, 3))
In [236]: X1.shape, Y1.shape
Out[236]: ((1, 3), (2, 1))

XY的值大于大多数用途实际需要的值。但通常使用它们而不是稀疏版本会有很多惩罚。

答案 1 :(得分:2)

y定义的线性间隔矢量linspacex分别使用3和2点。

然后,网格网格函数使用这些线性间隔矢量来创建2D线性间隔点云。这将是每个ymeshgrid坐标的点网格。此点云的大小为3 x 2.

函数x的输出会创建一个索引矩阵,在每个单元格中保存空间中每个点的y# dummy def meshgrid_custom(x,y): xv = np.zeros((len(x),len(y))) yv = np.zeros((len(x),len(y))) for i,ix in zip(range(len(x)),x): for j,jy in zip(range(len(y)),y): xv[i,j] = ix yv[i,j] = jy return xv.T, yv.T 坐标。

创建如下:

x = xv_1[1,1] = 0.5

因此,例如位置(1,1)处的点具有坐标:

y = yv_1[1,1] = 1.0
.ui-autocomplete { z-index: 99999; /* adjust this value */ }