Интерполяция сеточных данных - PullRequest
0 голосов
/ 05 марта 2019

Я надеялся, что кто-нибудь сможет мне помочь с проблемой, которая у меня возникла (я все еще очень плохо знаком с Python).Я пытался интерполировать данные из массива 50x4, который читается из таблицы Excel, показанной ниже.

 [ 60.      0.     23.88   22.38 ]  
 [ 60.      5.     19.508  28.2  ]  
 [ 60.     10.     16.9    32.23 ]  
 [ 60.     15.     15.4    34.03 ]  
 [ 60.     20.     14.4    35.12 ]  
 [ 60.     25.     13.66   36.02 ]  
 [ 60.     30.     13.14   36.61 ]  
 [ 60.     35.     12.69   37.14 ]  
 [ 60.     40.     12.53   37.56 ]  
 [ 60.     50.     12.33   38.32 ]  
 [ 70.      0.     19.3    21.34 ]  
 [ 70.      5.     16.06   25.37 ]  
 [ 70.     10.     13.74   28.08 ]  
 [ 70.     15.     12.33   40.07 ]  
 [ 70.     20.     11.45   41.78 ]  
 [ 70.     25.     10.77   42.8  ]

и т. Д.

То, что я пытаюсь достичь, - это ввести2 значения (скажем, 65 и 12), которые соответствуют интерполированным значениям в 1-м и 2-м столбцах, и он будет возвращать интерполированные значения для столбцов 3 и 4. Мне удалось заставить его работать, используя функцию griddata в matlab.Однако пока не везет в питоне.

Заранее спасибо

1 Ответ

0 голосов
/ 05 марта 2019

Я думаю, что scipy.interpolate может делать то же самое (или, по крайней мере, похоже), что и MATLAB Griddata .Приведенный ниже код использует радиальную базовую функцию для интерполяции.Я сделал только пример для вашего столбца 3 в качестве оси Z.

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.array([60] * 10 + [70] * 6)
y = np.array([0,5,10,15,20,25,30,35,40,50,0,5,10,15,20,25])
z = np.array([23.88, 19.508, 16.9, 15.4, 14.4, 13.66, 13.14, 12.69, 12.53, 12.33, 19.3, 16.06, 13.74, 12.33, 11.45, 10.77])
x_ticks = np.linspace(60, 70, 11)
y_ticks = np.linspace(0, 50, 51)    
XI, YI = np.meshgrid(x_ticks, y_ticks)

rbf = interpolate.Rbf(x, y, z, epsilon=2)
ZI = rbf(XI, YI)
print(ZI[np.argwhere(y_ticks==12)[0][0], np.argwhere(x_ticks==65)[0][0]])

>>> 14.222288614849171

Имейте в виду, что результатом будет ZI[y,x], а не ZI[x,y].Также помните, что ваши тики должны содержать запрашиваемые вами значения x и y, в противном случае вы получите IndexError.

Возможно, вы сможете использовать это решение в зависимости от ваших потребностей.

...