2015-09-07 30 views
1

我有三個二維數組,其形狀爲(100,100)。 每個陣列看起來像:在python中使用不同維度的數組進行2次插值

x = 
[[-104.09417725 -104.08866882 -104.0831604 ..., -103.8795166 -103.87399292 
-103.86849976] 
..., 
[-104.11058044 -104.10507202 -104.09954834 ..., -103.89535522 
-103.88983154 -103.88430786] 
[-104.11141968 -104.10591125 -104.10038757 ..., -103.89614868 -103.890625 
-103.88513184]] 
y = 
[[ 40.81712341 40.81744385 40.81776428 ..., 40.82929611 40.82960129 
40.82990646] 
..., 
[ 40.98789597 40.9882164 40.98854065 ..., 41.00011063 41.00041199 
41.00072479]] 
z = 
[[ 1605.58544922 1615.62341309 1624.33911133 ..., 1479.11254883 
1478.328125 1476.13378906] 
..., 
[ 1596.03857422 1600.5690918 1606.30712891 ..., 1598.56982422 
1594.90454102 1594.07763672]] 

另外我有X1和Y1的兩個1 d陣列。這些X1和Y1是在x和y的範圍分別如:

x1 = [ 104.07794 104.03169 104.03352 104.03584 104.03835 104.04085 
104.04334 104.07315 104.07133 104.07635 104.07916 104.0321 
104.03481 104.03741 104.04002 104.04366 104.04572 104.04787 
................................................................... 
103.92937 103.89825 103.90027 103.90253 103.90352 103.90375 
103.89922 103.89931 103.90145 103.90482 103.90885 103.91058 
103.91243 103.91525 103.91785 103.92078 103.97814] 
y1 = [ 40.9542 40.96922 40.96733 40.96557 40.96377 40.96218 40.96043 
40.95446 40.95686 40.95296 40.95184 40.94984 40.94834 40.9469 
40.94538 40.94287 40.94154 40.94008 40.93824 40.93705 40.93579 
......................................................................... 
40.89675 40.9015 40.90044 40.89948 40.89766 40.89513 40.88374 
40.88118 40.87915 40.87933 40.87917 40.878 40.87675 40.87598 
40.87515 40.87421 40.91258] 

X1和Y1對應爲(X1,Y1)相互以下指數如(104.07794,40.9542),(104.03169,40.96922)等等。 這裏我想得到的是z1對應於由x,y,z插值的(x1,y1)。 爲此,我做了類似下面代碼:

x1,y1 = np.meshgrid(x1,y1) 
f = interpolate.interp2d(x,y,z,kind='linear') 
or 
f = interpolate.Rbf(x,y,z,function='linear') 
z1 = f(x1,y1) 

不過,我不想X1,Y1轉換爲2 d meshgrid因爲這個功能填補我不喜歡填補了網格點因此,我想插入x1,y1而不轉換爲2 d meshgrid,但這些2d插值方法似乎要求x,y和x1,y1具有相同的維數。有沒有辦法插入,而不使x1,y1和x,y相同? 謝謝, 艾薩克

+1

正如前面寫到的'Rbf'答案所示,輸入('x'和'x1')都是1d數組。在你的情況下,你可能需要「扁平化」你的二維數組。 http://stackoverflow.com/a/29979983/901925 – hpaulj

回答

2

我不太清楚你的意思是關於x,y and x1,y1 have same dimesion

我可以構造一個輸入組數據:

In [294]: x,y=np.meshgrid(np.arange(10),np.arange(8))  
In [295]: z=x+y 

In [296]: f=interpolate.Rbf(x,y,z,kind='linear') 

In [297]: x.shape 
Out[297]: (8, 10) 

我使用meshgrid只是因爲它是生成一對二維數組,使一個合理的表面的最簡單的方法。因爲它是interp2d不喜歡使用這個表面。我可以定義另一組點作爲2 1d數組。點的數量與定義表面的點的字體數量或佈局無關。我只需要給出一個(x1,y1)對,它對應於定義曲面的(x,y,z)三元組。

In [298]: x1=np.linspace(0,10,15) 
In [299]: y1=np.linspace(0,10,15)  
In [300]: f(x1,y1) 
Out[300]: 
array([ 1.78745907e-13, 1.42752327e+00, 2.85761392e+00, 
     4.28560518e+00, 5.71422460e+00, 7.14293770e+00, 
     8.57139192e+00, 1.00000000e+01, 1.14285329e+01, 
     1.28573610e+01, 1.42852315e+01, 1.57040689e+01, 
     1.70924026e+01, 1.84049594e+01, 1.95946258e+01]) 

x是2d的事實並不重要;我可以將投入變平。 interp2d的文檔特別提到了對多維輸入做到這一點。

f1=interpolate.Rbf(x.flatten(), y.flatten(), z.flatten(), kind='linear') 

內插點可以被佈置在一個二維形狀以及

f(x1.reshape((3,5)), y1.reshape((3,5))) 

相同的內插值,只是設置在(3,5)陣列。


interp2d的操作有點不同。這似乎比「線性」「立方」幸福(我沒挖成爲什麼):

In [326]: f2=interpolate.interp2d(x,y,z,kind='cubic')  
In [327]: z1=f2(x1,y1) 

In [328]: z1.shape 
Out[328]: (15, 15) 

結果是(x1.shape, y1.shape) - 它對待x1,y1爲定義meshgrid像面。

但我可以提取對角線,並獲得基本相同的值Rbf(除了在2點結束):與Rbf

In [329]: z1.diagonal() 
Out[329]: 
array([ 7.61803576e-18, 1.42857137e+00, 2.85714294e+00, 
     4.28571419e+00, 5.71428543e+00, 7.14285905e+00, 
     8.57142306e+00, 1.00000000e+01, 1.14287955e+01, 
     1.28551995e+01, 1.41778962e+01, 1.54127554e+01, 
     8.99313361e+00, 1.60000000e+01, 1.60000000e+01]) 

所以你到底指定您希望它插的值,而interp2d您指定2d空間的x,y座標。

相關問題