Python - Interpolation 2D Array for Huge Arrays

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

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.

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.