2015-09-07 3 views
1

У меня есть три двухразрядных массива, которые имеют форму (100,100). Каждый массив выглядит следующим образом:2 d интерполяция с массивами с различными размерами в python

x = 
[[-104.09417725 -104.08866882 -104.0831604 ..., -103.8795166 -103.87399292 
-103.86849976] 
..., 
[-104.11058044 -104.10507202 -104.09954834 ..., -103.89535522 
-103.88983154 -103.88430786] 
[-104.11141968 -104.10591125 -104.10038757 ..., -103.89614868 -103.890625 
-103.88513184]] 
y = 
[[ 40.81712341 40.81744385 40.81776428 ..., 40.82929611 40.82960129 
40.82990646] 
..., 
[ 40.98789597 40.9882164 40.98854065 ..., 41.00011063 41.00041199 
41.00072479]] 
z = 
[[ 1605.58544922 1615.62341309 1624.33911133 ..., 1479.11254883 
1478.328125 1476.13378906] 
..., 
[ 1596.03857422 1600.5690918 1606.30712891 ..., 1598.56982422 
1594.90454102 1594.07763672]] 

Также у меня есть две 1 d массивы x1 и y1. Эти X1 и Y1 находятся в диапазоне от х и у, соответственно, такие, как:

x1 = [ 104.07794 104.03169 104.03352 104.03584 104.03835 104.04085 
104.04334 104.07315 104.07133 104.07635 104.07916 104.0321 
104.03481 104.03741 104.04002 104.04366 104.04572 104.04787 
................................................................... 
103.92937 103.89825 103.90027 103.90253 103.90352 103.90375 
103.89922 103.89931 103.90145 103.90482 103.90885 103.91058 
103.91243 103.91525 103.91785 103.92078 103.97814] 
y1 = [ 40.9542 40.96922 40.96733 40.96557 40.96377 40.96218 40.96043 
40.95446 40.95686 40.95296 40.95184 40.94984 40.94834 40.9469 
40.94538 40.94287 40.94154 40.94008 40.93824 40.93705 40.93579 
......................................................................... 
40.89675 40.9015 40.90044 40.89948 40.89766 40.89513 40.88374 
40.88118 40.87915 40.87933 40.87917 40.878 40.87675 40.87598 
40.87515 40.87421 40.91258] 

X1 и Y1 соответствуют как (x1, y1) друг друга следующие показатели, такие как (104.07794,40.9542), (104.03169,40.96922) и так далее. Здесь я хотел бы получить z1, соответствующий (x1, y1), интерполированный x, y, z. Для этого я сделал код, как показано ниже:

x1,y1 = np.meshgrid(x1,y1) 
f = interpolate.interp2d(x,y,z,kind='linear') 
or 
f = interpolate.Rbf(x,y,z,function='linear') 
z1 = f(x1,y1) 

Однако, я не хочу, чтобы преобразовать x1, y1 до 2 г meshgrid, потому что эта функция заполнения точек сетки, которые я не люблю, чтобы заполнить in. Итак, я хотел бы интерполировать x1, y1 без преобразования в 2 d meshgrid, но для этих 2d методов интерполяции требуется, чтобы x, y и x1, y1 имели одинаковый размер. Есть ли способ интерполировать, не делая размерности x1, y1 и x, y одинаковыми? Спасибо, Isaac

+1

Как показано в этом ответе 'Rbf', который я написал ранее, входы (как' x', так и 'x1') являются 1d массивами. В вашем случае вам, вероятно, нужно «сгладить» ваши 2d массивы. http://stackoverflow.com/a/29979983/901925 – hpaulj

ответ

2

Я не совсем уверен, что вы имеете в виду о x,y and x1,y1 have same dimesion.

можно построить входной набор данных:

In [294]: x,y=np.meshgrid(np.arange(10),np.arange(8))  
In [295]: z=x+y 

In [296]: f=interpolate.Rbf(x,y,z,kind='linear') 

In [297]: x.shape 
Out[297]: (8, 10) 

Я использую meshgrid только потому, что это самый простой способ для создания пары 2d массивов, которые делают разумную поверхность. Поскольку это interp2d не нравится работать с этой поверхностью.

Я могу определить другой набор точек как 2 1d массивов. Количество точек не имеет ничего общего с количеством точек или макетом точек, определяющих поверхность. Мне просто нужно дать пару (x1, y1), которая соответствует триплету (x, y, z), которая определяет поверхность.

In [298]: x1=np.linspace(0,10,15) 
In [299]: y1=np.linspace(0,10,15)  
In [300]: f(x1,y1) 
Out[300]: 
array([ 1.78745907e-13, 1.42752327e+00, 2.85761392e+00, 
     4.28560518e+00, 5.71422460e+00, 7.14293770e+00, 
     8.57139192e+00, 1.00000000e+01, 1.14285329e+01, 
     1.28573610e+01, 1.42852315e+01, 1.57040689e+01, 
     1.70924026e+01, 1.84049594e+01, 1.95946258e+01]) 

Тот факт, что x является 2d не имеет значения; Я мог бы сгладить входные данные. Документ для interp2d специально упоминает об этом для многомерных входов.

f1=interpolate.Rbf(x.flatten(), y.flatten(), z.flatten(), kind='linear') 

интерполяционных точек могут быть организованы в форме 2d, а

f(x1.reshape((3,5)), y1.reshape((3,5))) 

же интерполированных значений, только расположенных в (3,5) массива.


interp2d работает немного иначе. Это кажется более счастливым «кубическим», чем «линейная» (я не впился почему):

In [326]: f2=interpolate.interp2d(x,y,z,kind='cubic')  
In [327]: z1=f2(x1,y1) 

In [328]: z1.shape 
Out[328]: (15, 15) 

Результаты является (x1.shape, y1.shape) - это относится к x1,y1 в определении meshgrid как поверхность.

Но я могу извлечь диагональ и получить, по существу, одни и те же значения, что и Rbf (за исключением 2-х концах):

In [329]: z1.diagonal() 
Out[329]: 
array([ 7.61803576e-18, 1.42857137e+00, 2.85714294e+00, 
     4.28571419e+00, 5.71428543e+00, 7.14285905e+00, 
     8.57142306e+00, 1.00000000e+01, 1.14287955e+01, 
     1.28551995e+01, 1.41778962e+01, 1.54127554e+01, 
     8.99313361e+00, 1.60000000e+01, 1.60000000e+01]) 

Так с Rbf вы можете точно указать, где вы хотите, чтобы интерполировать значения, в то время как interp2d вы указываете координаты 2d пространства x,y.