2016-09-23 4 views
3

誰かが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.]) 

アンパックを使用して、2つの配列がより良く表示されるようにmeshgrid

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

および疎バージョンです。 X1X(但し2d)の1行のように見えます。 Yの1列のようなY1があります。

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は実際にほとんどの用途に必要とされるよりも多くの値を持ちます。しかし、通常、スパースなバージョンの代わりにそれらを使用することには多額のペナルティはありません。

2

xyで定義されたlinspaceはそれぞれ3と2ポイントを使用します。

これらの線形空間ベクトルは、meshgrid関数によって使用され、2D線形空間点群を作成します。これは、xy座標のそれぞれの点のグリッドになります。このポイントクラウドのサイズは3 x 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

返された行列は私にバグのあるものですが、どのように見えますか?どのようにそれらの2つのベクトルによって形成されますか?あなたが3x2と言うとき、それは3行* 2列を意味するか、何かが欠けていますか? – borgmater