2014-10-06 108 views
2

我有一個大小爲48x80的數組,現在我想將數組擴展爲一個大小爲117x192的新數組。
我已閱讀約scipy.interpolate,但它沒有提及延伸。如何擴展數組並將值放入新數組中?python - 擴展二維數組並插入缺失值

例如: 鑑於陣列A [[1,2,3],[4,5,6],[7,8,9]]

[1 2 3] 
[4 5 6] 
[7 8 9] 

現在我想延長數組A到陣列B尺寸5x7

1 x 2 x 3 
x x x x x 
x x x x x 
4 x 5 x 6 
x x x x x 
x x x x x 
7 x 8 x 9 

其中,用插值替換這些'x'。

例2: 在更一般的陣列

[4 2 6 4] 
[4 34 6 2] 
[2 11 3 4] 
[2 4 22 4] 
[2 1 35 255] 
[1 3 4 54] 
[22 1 4 5] 

,我應該怎麼做,如果我想在大小的新數組20X30

更新: 我想通了,有一個差別,使得@nicoguaro答案並不在我的情況下工作:

他的解決方案:

pts = np.array([[i,j] for i in np.linspace(0,1,n) for j in np.linspace(0,1,m)]) 
grid_x, grid_y = np.mgrid[0:1:m*2j, 0:1:n*2j] 

我的解決辦法:

pts = np.array([[i,j] for i in np.linspace(0,2*m-1,m) for j in np.linspace(0,2*n-1,n)]) 
grid_x, grid_y = np.mgrid[0:m*2, 0:n*2] 

它導致差異的結果。事實上,他的解決方案在大多數情況下工作,但TIFF文件,我猜

+0

可能重複(http://stackoverflow.com/ [什麼是在2個維度延伸numpy的陣列的最簡單的方法?]問題/ 877479 /最簡單的方法來擴展一個numpy陣列在2維) – 2014-10-06 08:54:51

+0

這一個說到追加一個或多個行到二維數組 – Jackie 2014-10-06 10:03:37

+0

我認爲你需要是關於你在問什麼更具體。 – 2014-10-06 14:34:19

回答

3

雖然interpolate沒有這個特定的任務功能,你可以很容易地使用內置的選項來做到這一點。使用相同的例子,你提出

[1 2 3] 
[4 5 6] 
[7 8 9] 

1 x 2 x 3 
x x x x x 
x x x x x 
4 x 5 x 6 
x x x x x 
x x x x x 
7 x 8 x 9 

我們可以利用這個代碼

import numpy as np 
import scipy.interpolate as inter 
import matplotlib.pyplot as plt 

A = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
vals = np.reshape(A, (9)) 
pts = np.array([[i,j] for i in [0.0, 0.5, 1.0] for j in [0.0, 0.5, 1.0]]) 
grid_x, grid_y = np.mgrid[0:1:7j, 0:1:5j] 
grid_z = inter.griddata(pts, vals, (grid_x, grid_y), method='linear') 

這讓作爲結果

array([[ 1. , 1.5, 2. , 2.5, 3. ], 
     [ 2. , 2.5, 3. , 3.5, 4. ], 
     [ 3. , 3.5, 4. , 4.5, 5. ], 
     [ 4. , 4.5, 5. , 5.5, 6. ], 
     [ 5. , 5.5, 6. , 6.5, 7. ], 
     [ 6. , 6.5, 7. , 7.5, 8. ], 
     [ 7. , 7.5, 8. , 8.5, 9. ]]) 

,或者爲圖像

Original image

Interpolated image

在這種情況下我用griddata,其插入在一組點(pts)到給定的直線網格的定義了一組功能(vals)(由grid_xgrid_y給出)。如果,例如,你想使用nx點$ X $和ny爲$ Y $,可以更換一個行

grid_x, grid_y = np.mgrid[0:1:nx*1j, 0:1:ny*1j] 

nx=20ny=15我們拿到的這款圖像

enter image description here

您可以在documentation of the function上看到更多示例。

更新:包含實施例2,其中基質是

A = np.array([[4, 2, 6, 4], 
      [4, 34, 6, 2], 
      [2, 11, 3, 4], 
      [2, 4, 22, 4], 
      [2, 1, 35, 255], 
      [1, 3, 4, 54], 
      [22, 1, 4, 5]]) 

和尺寸20×的一個新的數組。該代碼是下面

import numpy as np 
import scipy.interpolate as inter 
import matplotlib.pyplot as plt 

A = np.array([[4, 2, 6, 4], 
      [4, 34, 6, 2], 
      [2, 11, 3, 4], 
      [2, 4, 22, 4], 
      [2, 1, 35, 255], 
      [1, 3, 4, 54], 
      [22, 1, 4, 5]]) 
vals = np.reshape(A, (28)) 
pts = np.array([[i,j] for i in np.linspace(0,1,4) for j in np.linspace(0,1,7)]) 
grid_x, grid_y = np.mgrid[0:1:20j, 0:1:30j] 
grid_z = inter.griddata(pts, vals, (grid_x, grid_y), method='linear') 

plt.matshow(A) 
plt.matshow(grid_z) 
plt.show() 

所產生的圖像是: Example 2 Interpolated matrix in example 2

+0

感謝您的回覆!有些東西我不明白:pts,grid_x,grid_y的用途。如果我想要一個大小爲m(行)x n(列)的新數組,它會被改變 – Jackie 2014-10-07 04:37:21

+0

'pts'是你知道這些值的點,在這些圖像是由直線網格給出的情況下。 'grid_x'和'grid_y'是你想插值的地方,也就是_new_的地方。您可以查看[文檔](http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html)以獲取解釋。 – nicoguaro 2014-10-07 04:44:16

+1

我剛剛擴大了答案。 – nicoguaro 2014-10-07 04:52:17