[英]How to plot 2D matrix whose data is not equally spaced along x-axis using Python?
[英]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.