来自scipy.interpolate的bisplrep和bisplev问题

问题描述 投票:0回答:1

[bisplrep模块从bisplevscipy.interpolate收到一些非常奇怪的行为。我尝试从scipy主页(https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html)重现该示例。我有一些函数f(x,y),它计算出一些z值,然后使用bisplrep进行插值。如果使用bisplev重新计算数据并绘制数据,则结果值将旋转约90°。即使我交换了x和y值,绘图仍会旋转。有人可以告诉我我在这里做错了什么吗?以下代码应足以重现该错误。我正在使用最新版本的scipy,并且该错误发生在Jupyter,Spyder和IDLE中。

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

def f(x, y):
    return x**2 + y**2

x, y = np.linspace(0, 5, 15), np.linspace(-2*np.pi, 2*np.pi, 15)
xx, yy = np.meshgrid(x, y)
zz = f(xx, yy)

tck = interpolate.bisplrep(xx, yy, zz)

plt.pcolor(xx, yy, zz)

x_new, y_new = np.linspace(0, 5, 100), np.linspace(-2*np.pi, 2*np.pi, 100)

z_new = interpolate.bisplev(x_new, y_new, tck)

plt.figure()    
plt.pcolor(x_new, y_new, z_new)

plt.figure()    
plt.pcolor(y_new, x_new, z_new)

plt.show()
python scipy spline
1个回答
0
投票

我为网格使用了另一个定义。现在,它应该可以工作:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

def f(x, y):
    return x**2 + y**2

#x, y = np.linspace(0, 5, 15), np.linspace(-2*np.pi, 2*np.pi, 15)
xx, yy = np.mgrid[0:5:15j, -2*np.pi:2*np.pi:15j]
zz = f(xx, yy)

tck = interpolate.bisplrep(xx, yy, zz)

plt.pcolor(xx, yy, zz)

#x_new, y_new = np.linspace(0, 5, 100), np.linspace(-2*np.pi, 2*np.pi, 100)
xx_new, yy_new = np.mgrid[0:5:100j, -2*np.pi:2*np.pi:100j]

zz_new = interpolate.bisplev(xx_new[:,0], yy_new[0,:], tck)

plt.figure()    
plt.pcolor(xx_new, yy_new, zz_new)

plt.figure()    
plt.pcolor(yy_new, xx_new, zz_new)

plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.