Python - Interpolation 2D array for huge arrays

I would like to interpolate 2D array "test" whose dimensions are 4x4 (just as example, in reality close to 1000x1000) with a grid of shape 8x8.

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]]) 

I try with griddata but it seems work only 1D isnt it? as the errors tells me i have "different number of values and points" Do i make a mistake?

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') 
0

2 Answers

you can do this with scipy.interpolate.interp2d and numpy.meshgrid.

You need to make sure your new X and Y ranges go over the same range as the old ones, just with a smaller stepsize. This is easy with 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]] 
5

A convenient and fast way to do this would be by using skimage.transform.resize. It worked well for me also on large meshgrids:

import numpy as np from skimage.transform import resize test = np.random.rand(1000,1000) dim1, dim2 = 8, 8 test_resized = resize(test,(dim1,dim2)) print(test_resized.shape) >>> (8, 8) 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like