Scipy中二维插值的问题

时间:2010-10-10 09:13:47

标签: python scipy interpolation

在我的应用程序中,数据数据在失真的网格上进行采样,我想将其重新采样为非失真网格。为了测试这个,我编写了这个程序,其中包含示例性失真和一个简单的函数作为数据:

from __future__ import division

import numpy as np
import scipy.interpolate as intp
import pylab as plt

# Defining some variables:

quadratic = -3/128
linear = 1/16
pn = np.poly1d([quadratic, linear,0])

pixels_x = 50
pixels_y = 30
frame = np.zeros((pixels_x,pixels_y))

x_width= np.concatenate((np.linspace(8,7.8,57) , np.linspace(7.8,8,pixels_y-57)))

def data(x,y):
    z = y*(np.exp(-(x-5)**2/3) + np.exp(-(x)**2/5) + np.exp(-(x+5)**2))
    return(z)

# Generating grid coordinates

yt = np.arange(380,380+pixels_y*4,4)
xt = np.linspace(-7.8,7.8,pixels_x)
X, Y = np.meshgrid(xt,yt)
Y=Y.T
X=X.T

Y_m = np.zeros((pixels_x,pixels_y))
X_m = np.zeros((pixels_x,pixels_y))

# generating distorted grid coordinates:    

for i in range(pixels_y):
    Y_m[:,i] = Y[:,i] - pn(xt)
    X_m[:,i] = np.linspace(-x_width[i],x_width[i],pixels_x)


# Sample data:
for i in range(pixels_y):
    for j in range(pixels_x):
        frame[j,i] = data(X_m[j,i],Y_m[j,i])


Y_m = Y_m.flatten()
X_m = X_m.flatten()
frame = frame.flatten()
##
Y = Y.flatten()
X = X.flatten()
ipf = intp.interp2d(X_m,Y_m,frame)
interpolated_frame = ipf(xt,yt)

此时,我不得不提问:

  1. 代码有效,但我收到以下警告:

    警告:由于B样条系数的数量,不能再添加结 已超过数据点数m。可能原因:要么 或者太小了。 (FP> S) kx,ky = 1,1 nx,ny = 54,31 m = 1500 fp = 0.000006 s = 0.000000

  2. 此外,出现了一些插值工件,我认为它们与警告有关 - 你们知道我做错了吗?

    1. 对于我的实际应用程序,框架需要大约500 * 100,但是当这样做时,我得到一个MemoryError - 除了将框架分成几个部分之外,我能做些什么来帮助它?
    2. 谢谢!

3 个答案:

答案 0 :(得分:1)

对于2d插值, griddata 坚实,本地,快速。 在SO上查看problem-with-2d-interpolation-in-scipy-non-rectangular-grid

答案 1 :(得分:0)

此问题很可能与 interp2d bisplrep bisplev 的使用有关。 docs提及他们使用 s = 0.0 的抽取因子,并且如果更多控制,则应该直接使用 bisplrep bisplev 需要 s 。相关的docs提及 s 应该在(m-sqrt(2 * m),m + sqrt(2 * m))之间找到 > m 是用于构造样条曲线的点数。我有一个类似的问题,发现它直接使用 bisplrep bisplev 时解决了,其中 s 只是可选的。

答案 2 :(得分:-1)

您可能希望在底图中查看以下interp方法:

mpl_toolkits.basemap.interp    http://matplotlib.sourceforge.net/basemap/doc/html/api/basemap_api.html

除非你真的需要基于样条的插值。