有時候會碰到這種情況:
實際問題可以抽象為 \(z = f(x, y)\) 的形式,而你只知道有限的點 \((x_i,y_i,z_i)\),你又需要局部的全數據,這時你就需要插值,一維的插值方法網上很多,不再贅述,這里僅介紹二維的插值法
這里主要利用 scipy.interpolate 包里 griddata 函數
griddata(points, values, xi, method='linear', fill_value=numpy.nan, rescale=False)
- points:二維數組,第一維是已知點的數目,第二維是每一個點的 \(x,y\) 坐標
- values:一維數組,和 points 的第一維長度一樣,是每個坐標的對應 \(z\) 值
- xi:需要插值的空間,一般用
numpy.mgrid函數生成后傳入 - method:插值方法
- nearest
- linear
- cubic
- fill_value:無數據時填充數據
該方法返回的是和 xi 的 shape 一樣的二維數組
【example】
import numpy as np
import matplotlib.pyplot a plt
from scipy.interpolate import griddata
points = np.random.rand(n, 2) # n是已知點個數
values = np.random.rand(n) # 對應沒每個點的值
# 插值的目標
# 注意,這里和普通使用數組的維度、下標不一樣,是因為如果可視化的話,imshow坐標軸和一般的不一樣
x, y = np.mgrid[
end1:start1:step1 * 1j,
start2:end2:step2 * 1j]
# grid就是插值結果,你想要的到的區間的每個點數據都在這個grid矩陣里
grid = griddata(points, values, (x, y), method="cubic", fill_value=0)
# 這里通過imshow顯示時,坐標思維要按照計算機的來,普通圖片是2維數組
# x 是最終結果的第一維,下標是從上到下由零增加
# y 是最終結果的第二維,下標是從左到右由零增加
plt.subplot(1, 1, 1)
plt.title("0°")
plt.imshow(grid, cmap='jet') # contourf jet gray
plt.colorbar()
plt.show()
np.mgrid函數每一個維度最后一個參數:
- 可以是實數中的整數,表示步長,此時不包括末尾數據(左閉右開)
- 可以是實部為零,虛部為整數的復數,這個數字表示該區間想要插值多少個點的數據(閉區間)
