9

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 2

8

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]] 
Sign up to request clarification or add additional context in comments.

5 Comments

That works! ;) but for my case, it seems to be that there it "Too many data points to interpolate" as error :(
how big is your new array? maybe you could split it into sub-arrays to perform the interpolation, and then stitch them together afterwards?
You can reduce your memory overhead a bit by creating an open grid for your x and y coordinates, i.e. an (nx, 1) array and an (1, ny) rather than two (nx, ny) arrays. For example, x, y = np.meshgrid(X, Y, sparse=True) or x, y = np.ix_(X, Y).
Shouldn't scipy.interpolate.RegularGridInterpolator do the job much more efficiently?
Why are you picking 3 as mymax here? I'm unsure how that choice affects the final result.
2

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)

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.