2015-10-21 4 views
4

Я хотел бы интерполировать 2D-массив «test», размеры которого - это 4x4 (как пример, на самом деле близко к 1000x1000) с сеткой формы 8x8.Python - Интерполяция 2D-массив для огромных массивов

import numpy as np 

X = np.arange(0,4,1) 
Y = np.arange(0,4,1) 

points = np.vstack((X,Y)) 
points = points.T #my coordinates 

#my values as a 2D array 
test = np.array([[ 1.2514318 , 1.25145821, 1.25148472, 1.25151133], 
     [ 1.25087456, 1.25090105, 1.25092764, 1.25095435], 
     [ 1.25031581, 1.25034238, 1.25036907, 1.25039586], 
     [ 1.24975557, 1.24978222, 1.24980898, 1.24983587]]) 

Я стараюсь использовать griddata, но кажется, что работает только 1D, не так ли? поскольку ошибки говорят мне, что у меня «разное количество значений и точек». Я делаю ошибку?

from scipy.interpolate import griddata 
grid_x, grid_y = np.mgrid[0:4:8j, 0:4:8j] 
grid_z0 = griddata(points, test, (grid_x, grid_y), method='linear') 

ответ

4

вы можете сделать это с scipy.interpolate.interp2d и numpy.meshgrid.

Вам нужно убедиться, что ваши новые диапазоны X и Y проходят в том же диапазоне, что и старые, только с меньшим шагом. Это легко сделать с np.linspace:

import numpy as np 
from scipy import interpolate 

mymin,mymax = 0,3 
X = np.linspace(mymin,mymax,4) 
Y = np.linspace(mymin,mymax,4) 

x,y = np.meshgrid(X,Y) 

test = np.array([[ 1.2514318 , 1.25145821, 1.25148472, 1.25151133], 
     [ 1.25087456, 1.25090105, 1.25092764, 1.25095435], 
     [ 1.25031581, 1.25034238, 1.25036907, 1.25039586], 
     [ 1.24975557, 1.24978222, 1.24980898, 1.24983587]]) 

f = interpolate.interp2d(x,y,test,kind='cubic') 

# use linspace so your new range also goes from 0 to 3, with 8 intervals 
Xnew = np.linspace(mymin,mymax,8) 
Ynew = np.linspace(mymin,mymax,8) 

test8x8 = f(Xnew,Ynew) 

print test8x8 
>>> [[ 1.2514318 1.25144311 1.25145443 1.25146577 1.25147714 1.25148852 1.25149991 1.25151133] 
    [ 1.25119317 1.25120449 1.25121583 1.25122719 1.25123856 1.25124995 1.25126137 1.25127281] 
    [ 1.25095426 1.2509656 1.25097695 1.25098832 1.25099971 1.25101112 1.25102255 1.25103401] 
    [ 1.25071507 1.25072642 1.25073779 1.25074918 1.25076059 1.25077201 1.25078346 1.25079494] 
    [ 1.25047561 1.25048697 1.25049835 1.25050976 1.25052119 1.25053263 1.2505441 1.25055558] 
    [ 1.25023587 1.25024724 1.25025864 1.25027007 1.25028151 1.25029297 1.25030446 1.25031595] 
    [ 1.24999585 1.25000724 1.25001866 1.2500301 1.25004156 1.25005304 1.25006453 1.25007605] 
    [ 1.24975557 1.24976698 1.24977841 1.24978985 1.24980132 1.24981281 1.24982433 1.24983587]] 
+0

Это работает! ;) но для моего случая кажется, что там «слишком много точек данных для интерполяции» как ошибка :( – user3601754

+0

Насколько велика ваш новый массив? Возможно, вы могли бы разбить его на подмассивы для выполнения интерполяции, а затем а затем соедините их вместе? – tom

+0

см., например, этот [другой ответ] (http://stackoverflow.com/a/5329386/588071) – tom

Смежные вопросы