0
点赞
收藏
分享

微信扫一扫

[python] 使用 scipy 的 griddata 曲面插值

0. 背景

在做项目的时候,遇到给定空间中的几个点,插值得到空间曲面。对于 MATLAB 来说,有 griddata 这个函数可以实现;对于 Python 来说,我们可以使用 scipy 中的 griddata 也可以实现;

1. 使用的实现函数:

  • meshgrid 网格坐标的一维数组
  • griddata scipy 中的插值函数,插值得到 N 维坐标

2. 测试代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
from mpl_toolkits.mplot3d import axes3d


def generate_data_3():
    """ point number : 16 """
    x = [0, 0, 0, 1, 2, 2, 2, 2, 4, 4, 4, 1, 6, 6, 6, 6]
    y = [0, 4, 8, 12, 0, 4, 8, 13, 0, 4, 8, 15, 0, 4, 8, 11]
    z = [0, 0, -3, 5, 6, 0, 0, 7, 0, 0, -3, 1, 6, -3, 0, 8]
    return x, y, z


x, y, z = generate_data_3()

# target grid to interpolate to
xi = np.array(np.arange(np.min(x) - 20, np.max(x) + 20, 0.1), dtype=np.float)
yi = np.array(np.arange(np.min(y) - 20, np.max(y) + 20, 0.1), dtype=np.float)
xi, yi = np.meshgrid(xi, yi)

# interpolate
zi = griddata((x, y), z, (xi, yi), method='cubic')

# plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(xi, yi, zi, rstride=1, cstride=1)

plt.plot(x, y, z, 'k.')
plt.xlabel('xi', fontsize=16)
plt.ylabel('yi', fontsize=16)
plt.ylabel('zi', fontsize=16)

plt.title('point number: 16')
plt.show()

3. 结果:

显示图像以及插值点

举报

相关推荐

0 条评论