2016-09-23 92 views
3

有人可能會關心explin meshgrid方法嗎?我無法圍住它。這個例子是從SciPy網站:numpy.meshgrid說明

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 :)

回答

3
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.]]) 

當用於像加號和時間這樣的計算時,兩種表單都表現相同。這是因爲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具有比實際需要對大多數用戶更多的價值。但通常使用它們並沒有太多的代價,而是使用稀疏版本。

2

linspace定義的線性間隔矢量xy分別使用3點和2點。

這些線性間隔矢量然後被網格函數用來創建2D線性間隔點雲。這將是每個xy座標的網格點。該點雲的大小將是3×2

功能meshgrid的輸出創建每個小區中的xy座標你的空間中的每個點保持的索引矩陣。

這被如下創建:

# 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 

因此,例如在位置(1,1)的點的座標爲:

x = xv_1[1,1] = 0.5
y = yv_1[1,1] = 1.0

+0

返回的矩陣是錯誤的東西,它是怎樣的?這兩個向量是如何形成的?當你說3x2時,這意味着3行* 2列或我錯過了什麼? – borgmater