双三次插值 python实现_双三次插值Python

双三次插值 python实现_双三次插值Python我用 Python 编程语言开发了双三次插值来演示给一些本科生 方法如 wikipedia 所述 代码运行良好 只是得到的结果与使用 scipy 库时得到的结果略有不同 插值代码在下面的函数 bicubic interpolatio 中显示 importnumpya pyplotaspltf toolkitsimpo

我用Python编程语言开发了双三次插值来演示给一些本科生。

方法如wikipedia所述,

代码运行良好,只是得到的结果与使用scipy库时得到的结果略有不同。

插值代码在下面的函数bicubic_interpolation中显示。import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits import mplot3d

from scipy import interpolate

import sympy as syp

import pandas as pd

pd.options.display.max_colwidth = 200

%matplotlib inline

def bicubic_interpolation(xi, yi, zi, xnew, ynew):

# check sorting

if np.any(np.diff(xi) < 0) and np.any(np.diff(yi) < 0) and\

np.any(np.diff(xnew) < 0) and np.any(np.diff(ynew) < 0):

raise ValueError(‘data are not sorted’)

if zi.shape != (xi.size, yi.size):

raise ValueError(‘zi is not set properly use np.meshgrid(xi, yi)’)

z = np.zeros((xnew.size, ynew.size))

deltax = xi[1] – xi[0]

deltay = yi[1] – yi[0]

for n, x in enumerate(xnew):

for m, y in enumerate(ynew):

if xi.min() <= x <= xi.max() and yi.min() <= y <= yi.max():

i = np.searchsorted(xi, x) – 1

j = np.searchsorted(yi, y) – 1

x0 = xi[i-1]

x1 = xi[i]

x2 = xi[i+1]

x3 = x1+2*deltax

y0 = yi[j-1]

y1 = yi[j]

y2 = yi[j+1]

y3 = y1+2*deltay

px = (x-x1)/(x2-x1)

py = (y-y1)/(y2-y1)

f00 = zi[i-1, j-1] #row0 col0 >> x0,y0

f01 = zi[i-1, j] #row0 col1 >> x1,y0

f02 = zi[i-1, j+1] #row0 col2 >> x2,y0

f10 = zi[i, j-1] #row1 col0 >> x0,y1

f11 = p00 = zi[i, j] #row1 col1 >> x1,y1

f12 = p01 = zi[i, j+1] #row1 col2 >> x2,y1

f20 = zi[i+1,j-1] #row2 col0 >> x0,y2

f21 = p10 = zi[i+1,j] #row2 col1 >> x1,y2

f22 = p11 = zi[i+1,j+1] #row2 col2 >> x2,y2

if 0 < i < xi.size-2 and 0 < j < yi.size-2:

f03 = zi[i-1, j+2] #row0 col3 >> x3,y0

f13 = zi[i,j+2] #row1 col3 >> x3,y1

f23 = zi[i+1,j+2] #row2 col3 >> x3,y2

f30 = zi[i+2,j-1] #row3 col0 >> x0,y3

f31 = zi[i+2,j] #row3 col1 >> x1,y3

f32 = zi[i+2,j+1] #row3 col2 >> x2,y3

f33 = zi[i+2,j+2] #row3 col3 >> x3,y3

elif i<=0:

f03 = f02 #row0 col3 >> x3,y0

f13 = f12 #row1 col3 >> x3,y1

f23 = f22 #row2 col3 >> x3,y2

f30 = zi[i+2,j-1] #row3 col0 >> x0,y3

f31 = zi[i+2,j] #row3 col1 >> x1,y3

f32 = zi[i+2,j+1] #row3 col2 >> x2,y3

f33 = f32 #row3 col3 >> x3,y3

elif j<=0:

f03 = zi[i-1, j+2] #row0 col3 >> x3,y0

f13 = zi[i,j+2] #row1 col3 >> x3,y1

f23 = zi[i+1,j+2] #row2 col3 >> x3,y2

f30 = f20 #row3 col0 >> x0,y3

f31 = f21 #row3 col1 >> x1,y3

f32 = f22 #row3 col2 >> x2,y3

f33 = f23 #row3 col3 >> x3,y3

elif i == xi.size-2 or j == yi.size-2:

f03 = f02 #row0 col3 >> x3,y0

f13 = f12 #row1 col3 >> x3,y1

f23 = f22 #row2 col3 >> x3,y2

f30 = f20 #row3 col0 >> x0,y3

f31 = f21 #row3 col1 >> x1,y3

f32 = f22 #row3 col2 >> x2,y3

f33 = f23 #row3 col3 >> x3,y3

px00 = (f12 – f10)/2*deltax

px01 = (f22 – f20)/2*deltax

px10 = (f13 – f11)/2*deltax

px11 = (f23 – f21)/2*deltax

py00 = (f21 – f01)/2*deltay

py01 = (f22 – f02)/2*deltay

py10 = (f31 – f11)/2*deltay

py11 = (f32 – f12)/2*deltay

pxy00 = ((f22-f20) – (f02-f00))/4*deltax*deltay

pxy01 = ((f32-f30) – (f12-f10))/4*deltax*deltay

pxy10 = ((f23-f21) – (f03-f01))/4*deltax*deltay

pxy11 = ((f33-f31) – (f13-f11))/4*deltax*deltay

f = np.array([p00, p01, p10, p11,

px00, px01, px10, px11,

py00, py01, py10, py11,

pxy00, pxy01, pxy10, pxy11])

a = A@f

a = a.reshape(4,4).transpose()

z[n,m] = np.array([1, px, px2, px3]) @ a @ np.array([1, py, py2, py3])

return z

在函数bicubic_interpolation中,输入是xi=旧的x数据范围,yi=旧的y范围,zi=网格点(x,y)的旧值,xnew,和ynew是新的水平数据范围。所有输入都是1D numpy数组,除了zi是2D numpy数组。

我正在测试函数的数据如下所示。我将结果与scipy和真模型(函数f)进行比较。def f(x,y):

return np.sin(np.sqrt(x 2 + y 2))

x = np.linspace(-6, 6, 11)

y = np.linspace(-6, 6, 11)

xx, yy = np.meshgrid(x, y)

z = f(xx, yy)

x_new = np.linspace(-6, 6, 100)

y_new = np.linspace(-6, 6, 100)

xx_new, yy_new = np.meshgrid(x_new, y_new)

z_new = bicubic_interpolation(x, y, z, x_new, y_new)

z_true = f(xx_new, yy_new)

f_scipy = interpolate.interp2d(x, y, z, kind=’cubic’)

z_scipy = f_scipy(x_new, y_new)

fig, ax = plt.subplots(2, 2, sharey=True, figsize=(16,12))

img0 = ax[0, 0].scatter(xx, yy, c=z, s=100)

ax[0, 0].set_title(‘original points’)

fig.colorbar(img0, ax=ax[0, 0], orientation=’vertical’, shrink=1, pad=0.01)

img1 = ax[0, 1].imshow(z_new, vmin=z_new.min(), vmax=z_new.max(), origin=’lower’,

extent=[x_new.min(), x_new.max(), y_new.max(), y_new.min()])

ax[0, 1].set_title(‘bicubic our code’)

fig.colorbar(img1, ax=ax[0, 1], orientation=’vertical’, shrink=1, pad=0.01)

img2 = ax[1, 0].imshow(z_scipy, vmin=z_scipy.min(), vmax=z_scipy.max(), origin=’lower’,

extent=[x_new.min(), x_new.max(), y_new.max(), y_new.min()])

ax[1, 0].set_title(‘bicubic scipy’)

fig.colorbar(img2, ax=ax[1, 0], orientation=’vertical’, shrink=1, pad=0.01)

img3 = ax[1, 1].imshow(z_true, vmin=z_true.min(), vmax=z_true.max(), origin=’lower’,

extent=[x_new.min(), x_new.max(), y_new.max(), y_new.min()])

ax[1, 1].set_title(‘true model’)

fig.colorbar(img3, ax=ax[1, 1], orientation=’vertical’, shrink=1, pad=0.01)

plt.subplots_adjust(wspace=0.05, hspace=0.15)

plt.show()

结果如下:

fe306d08a9a407fab235ead9d4c52707.png

矩阵A(函数内部bicubic_interpolation)如维基百科网站所述,可以使用以下代码简单地获得:x = syp.Symbol(‘x’)

y = syp.Symbol(‘y’)

a00, a01, a02, a03, a10, a11, a12, a13 = syp.symbols(‘a00 a01 a02 a03 a10 a11 a12 a13’)

a20, a21, a22, a23, a30, a31, a32, a33 = syp.symbols(‘a20 a21 a22 a23 a30 a31 a32 a33’)

p = a00 + a01*y + a02*y2 + a03*y3\

+ a10*x + a11*x*y + a12*x*y2 + a13*x*y3\

+ a20*x2 + a21*x2*y + a22*x2*y2 + a23*x2*y3\

+ a30*x3 + a31*x3*y + a32*x3*y2 + a33*x3*y3

px = syp.diff(p, x)

py = syp.diff(p, y)

pxy = syp.diff(p, x, y)

df = pd.DataFrame(columns=[‘function’, ‘evaluation’])

for i in range(2):

for j in range(2):

function = ‘p({}, {})’.format(j,i)

df.loc[len(df)] = [function, p.subs({x:j, y:i})]

for i in range(2):

for j in range(2):

function = ‘px({}, {})’.format(j,i)

df.loc[len(df)] = [function, px.subs({x:j, y:i})]

for i in range(2):

for j in range(2):

function = ‘py({}, {})’.format(j,i)

df.loc[len(df)] = [function, py.subs({x:j, y:i})]

for i in range(2):

for j in range(2):

function = ‘pxy({}, {})’.format(j,i)

df.loc[len(df)] = [function, pxy.subs({x:j, y:i})]

eqns = df[‘evaluation’].tolist()

symbols = [a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,a30,a31,a32,a33]

A = syp.linear_eq_to_matrix(eqns, *symbols)[0]

A = np.array(A.inv()).astype(np.float64)

print(df)

print(A)

e164faa818778662283464cf05c0fb4b.png

2e5c6fbb766b1ef48f88631e1d837bfe.png

我想知道bicubic_interpolation函数的问题在哪里,为什么它与scipy得到的结果略有不同?

非常感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211121.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:10
下一篇 2026年3月18日 下午11:10


相关推荐

  • Android,播放m3u8视频和下载m3u8的视频「建议收藏」

    Android,播放m3u8视频和下载m3u8的视频「建议收藏」因最近项目需要,研究了一个礼拜的m3u8。格式为m3u8的视频,其实是由多个.ts文件组成在一起播放的。下面有些资料是参考了网上的,总体概括下实现思路:1.根据后台给出的m3u8的地址,实现播放,核心代码贴出:try{Stringurl=”http://devimages.apple.com/iphone/samples/bipbop/bipbopal

    2022年6月23日
    73
  • 理查德•弗曼学习法思维导图-程序猿学习法

    理查德•弗曼学习法思维导图-程序猿学习法理查德•弗曼学习法思维导图-程序猿学习法

    2022年6月12日
    32
  • 字符串的匹配算法_多字符串匹配

    字符串的匹配算法_多字符串匹配文章目录BF算法RK算法编辑器中的全局替换方法:BM算法坏字符好后缀规则代码实现KMP算法一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢?想到是很正常的,谁让它那么优秀呢。BF算法不要被事物的表面现象所迷惑,这个算法全称:BruteForce,有个拉风的中文名:暴力匹配算法。能想明白了吧。如果模式串长度为m,主串长度为n,那在主串中,就会有n-m+1个长度为m的子串,我们只需要暴力地对比这n-m+1个子串与模式串,就可以找出主串与模式串匹配的子串。.

    2022年8月21日
    9
  • 数据库6「建议收藏」

    数据库6「建议收藏」https://www.cnblogs.com/zhanht/p/5450559.html本文主要介绍MySQL中关于索引的一些问题,例如:索引的作用;怎么创建索引;设计索引的原则;怎么优化索引等

    2022年7月4日
    27
  • 数据结构–链表的排序详解

    数据结构–链表的排序详解1、前言前面两篇博客,我已经把线性表的两种基本的表示形式,做了一个基本的介绍和一些对比。但是,我突然发现在链表这里我缺少一个很重要的内容,那就是对我们的链表进行排序,其实,在连接两个链表的时候,就要求我们的那两个链表是有序的。2、链表排序—最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数据域)//线性表的排序,采用冒泡排序,直接遍历链表voidListsort(Nod

    2022年10月11日
    4
  • CRC校验码的计算

    CRC校验码的计算循环冗余检验的原理 在发送端 先把数据划分为组 假定每组 k 个比特 假定一个待传送的数据 M k 位 CRC 运算就是在数据 M 的后面添加供差错检测用的 n 位冗余码 然后构成一个帧发送出去 一共发送 k 1 位 在所要发送的数据后面增加 n 位的冗余码 虽然增大了数据传输的开销 但却可以进行差错检测 当传输可能出现差错时 付出这种代价往往是很值得的 下面通过一个具体的例子来进行分析计算 例 要发送的数据为

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号