簡體   English   中英

使用Python沿列插值2D矩陣

[英]Interpolate 2D matrix along columns using Python

我正在嘗試將尺寸為(5,3)的2D numpy矩陣插值為沿軸1(列)的尺寸為(7,3)的矩陣。 顯然,錯誤的方法是在原始矩陣之間的任意位置隨機插入行,請參見以下示例:

Source:
 [[0, 1, 1]
  [0, 2, 0]
  [0, 3, 1]
  [0, 4, 0]
  [0, 5, 1]]

Target (terrible interpolation -> not wanted!):
 [[0, 1, 1]
  [0, 1.5, 0.5]
  [0, 2, 0]
  [0, 3, 1]
  [0, 3.5, 0.5]
  [0, 4, 0]
  [0, 5, 1]]

正確的方法是考慮到每一行並在所有行之間進行插值,以將源矩陣擴展為(7,3)矩陣。 我知道scipy.interpolate.interp1d或scipy.interpolate.interp2d方法,但無法使其與其他Stack Overflow帖子或網站一起使用。 我希望收到任何類型的提示或技巧。

更新#1:期望值應均勻分布。

更新#2:我要做的基本上是使用原始矩陣的單獨列,將列的長度擴展為7,然后在原始列的值之間進行插值。 請參見以下示例:

Source:
 [[0, 1, 1]
  [0, 2, 0]
  [0, 3, 1]
  [0, 4, 0]
  [0, 5, 1]]

Split into 3 separate Columns:
 [0    [1    [1
  0     2     0
  0     3     1
  0     4     0
  0]    5]    1] 

Expand length to 7 and interpolate between them, example for second column:
 [1
  1.66
  2.33
  3
  3.66
  4.33
  5]   

似乎可以完全獨立地對待每一列,但是對於每一列,您基本上都需要定義一個“ x”坐標,以便可以擬合一些函數“ f(x)”,從中生成輸出矩陣。 除非矩陣中的行與其他數據結構(例如,時間戳記的向量)相關聯,否則x值的明顯集合就是行號:

x = numpy.arange(0, Source.shape[0])

然后可以構造一個插值函數:

fit = scipy.interpolate.interp1d(x, Source, axis=0)

並使用它來構建輸出矩陣:

Target = fit(numpy.linspace(0, Source.shape[0]-1, 7)

產生:

array([[ 0.        ,  1.        ,  1.        ],
       [ 0.        ,  1.66666667,  0.33333333],
       [ 0.        ,  2.33333333,  0.33333333],
       [ 0.        ,  3.        ,  1.        ],
       [ 0.        ,  3.66666667,  0.33333333],
       [ 0.        ,  4.33333333,  0.33333333],
       [ 0.        ,  5.        ,  1.        ]])

默認情況下,scipy.interpolate.interp1d使用分段線性插值。 scipy.interpolate中 ,還有基於高階多項式等的更多奇特選項。插值本身就是一個大話題,並且除非矩陣的行具有某些特定屬性(例如,具有已知頻率的信號的常規樣本)范圍),可能沒有“真正正確”的插值方式。 因此,在某種程度上,插值方案的選擇會有些隨意。

您可以按照以下步驟進行操作:

from scipy.interpolate import interp1d
import numpy as np


a = np.array([[0, 1, 1],
               [0, 2, 0],
               [0, 3, 1],
               [0, 4, 0],
               [0, 5, 1]])

x = np.array(range(a.shape[0]))

# define new x range, we need 7 equally spaced values
xnew = np.linspace(x.min(), x.max(), 7)

# apply the interpolation to each column
f = interp1d(x, a, axis=0)

# get final result
print(f(xnew))

這將打印

[[ 0.          1.          1.        ]
 [ 0.          1.66666667  0.33333333]
 [ 0.          2.33333333  0.33333333]
 [ 0.          3.          1.        ]
 [ 0.          3.66666667  0.33333333]
 [ 0.          4.33333333  0.33333333]
 [ 0.          5.          1.        ]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM