2010-10-10 4 views
3

В моем приложении данные данных отбираются на искаженной сетке, и я хотел бы переделать ее в неразрешенную сетку. Для того, чтобы проверить это, я написал эту программу с иллюстративных искажениями и простую функцию, как данные:Проблемы с 2D-интерполяцией в Scipy

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. Вероятно, вызывает: s или m слишком мало. (FP> s) кх, ку = 1,1 пх, пу = 54,31 м = 1500 Fp = 0,000006 s = 0,000000

Кроме того, появляются некоторые интерполяции артефакты, и я предполагаю, что они связаны между собой к предупреждению - Вы, ребята, знаете, что я делаю неправильно?

  1. Для моих реальных приложений, кадры должны быть около 500 * 100, но при этом, я получаю MemoryError - Есть ли что-то я могу сделать, чтобы помочь, что, помимо разделения кадра на несколько частей?

Спасибо!

ответ

-1

Вы можете посмотреть по следующему Interp методы базовой карты:

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

, если вам действительно нужна сплайн на основе интерполяция.

+0

Извините, это не поможет - mpl_toolkits.basemap.interp предназначен только для интерполяции одной прямолинейной сетки на другую. Это условие не удовлетворяет моей входной сетке. – Dzz

+0

Ссылка мертва ... –

0

Эта проблема, скорее всего, связано с использованием bisplrep и bisplev в interp2d. docs упоминание, что они используют фактор smooting из S = 0.0 и что bisplrep и bisplev следует использовать непосредственно, если больший контроль над с требуется. Связанные docs отметить, что с должен быть найдены между (м-SQRT (2 * м), м + SQRT (2 * м)), гдем является числом точек, используемых для построения сплайнов. У меня была аналогичная проблема, и я решил, что она решила при использовании bisplrep и bisplev напрямую, где s является необязательным.