Python - 巨大数组的插值二维数组
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33259896/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Python - Interpolation 2D array for huge arrays
提问by user3601754
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.
我想用形状为 8x8 的网格插入尺寸为 4x4(例如,实际上接近 1000x1000)的二维数组“测试”。
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?
我尝试使用 griddata,但它似乎只能用于一维,不是吗?正如错误告诉我我有“不同数量的值和点”我犯了错误吗?
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')
采纳答案by tmdavison
you can do this with scipy.interpolate.interp2d
and numpy.meshgrid
.
你可以用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
:
您需要确保新的 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]]