来自 scipy.interpolate 的 bisplrep 和 bisplev 的问题
Problems with bisplrep and bisplev from scipy.interpolate
我从 scipy.interpolate
模块收到 bisplrep
和 bisplev
的一些非常奇怪的行为。我尝试重现 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()
我对网格使用了另一种定义。现在,它应该可以工作了:
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()
我从 scipy.interpolate
模块收到 bisplrep
和 bisplev
的一些非常奇怪的行为。我尝试重现 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()
我对网格使用了另一种定义。现在,它应该可以工作了:
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()