Ответ 1
Сравнивая ваш пример кода с заголовком вопроса, я думаю, вы немного смущены...
В вашем примере кода вы создаете случайные данные с произвольной сеткой и затем передискретируете их на другую регулярную сетку. У вас нет нерегулярных данных в любом месте вашего примера...
(Кроме того, код не запускается как есть, и вы должны заглянуть в meshgrid
, а не цикл для генерации ваши х и у сетки.)
Если вы хотите повторно выбрать уже настроенную сетку, как и в вашем примере, есть более эффективные методы, чем griddata или что-то, о чем я расскажу ниже. (scipy.ndimage.map_coordinates
будет хорошо подходит для вашей проблемы, в этом случае.)
Однако, исходя из вашего вопроса, похоже, что у вас есть нерегулярно разнесенные данные, которые вы хотите интерполировать на регулярную сетку.
В этом случае у вас могут быть такие моменты:
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# Bounds and number of the randomly generated data points
ndata = 20
xmin, xmax = -8, 8
ymin, ymax = 380, 2428
# Generate random data
x = np.random.randint(xmin, xmax, ndata)
y = np.random.randint(ymin, ymax, ndata)
z = np.random.random(ndata)
# Plot the random data points
plt.scatter(x,y,c=z)
plt.axis([xmin, xmax, ymin, ymax])
plt.colorbar()
plt.show()
Затем вы можете интерполировать данные так же, как и раньше... (Продолжение из фрагмента кода выше...)
# Size of regular grid
ny, nx = 512, 115
# Generate a regular grid to interpolate the data.
xi = np.linspace(xmin, xmax, nx)
yi = np.linspace(ymin, ymax, ny)
xi, yi = np.meshgrid(xi, yi)
# Interpolate using delaunay triangularization
zi = mlab.griddata(x,y,z,xi,yi)
# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
Однако вы заметите, что вы получаете множество артефактов в сетке. Это связано с тем, что ваши координаты x варьируются от -8 до 8, а координаты y - от ~ 300 до ~ 2500. Алгоритм интерполяции пытается сделать вещи изотропными, в то время как вам может потребоваться очень анизотропная интерполяция (так что она выглядит изотропной при построении сетки).
Чтобы исправить это, вам нужно создать новую систему координат, чтобы выполнить свою интерполяцию. Не существует ни одного правильного способа сделать это. То, что я использую ниже, будет работать, но "лучший" способ сильно зависит от того, что на самом деле представляют ваши данные.
(Другими словами, используйте то, что вы знаете о системе, которое ваши данные измеряют, чтобы решить, как это сделать. Это всегда верно при интерполяции! Не следует интерполировать, если вы не знаете, как выглядит результат , и достаточно знакомы с алгоритмом интерполяции, чтобы использовать эту априорную информацию в ваших интересах! Существуют также гораздо более гибкие алгоритмы интерполяции, чем триангуляция Delaunay, которые по умолчанию используют griddata, но это прекрасно для простой пример...)
Во всяком случае, один из способов сделать это - перемасштабировать координаты x и y так, чтобы они превышали примерно одинаковые величины. В этом случае. мы будем масштабировать их от 0 до 1... (простите строковый код спагетти... Я просто намереваюсь, чтобы это был пример...)
# (Continued from examples above...)
# Normalize coordinate system
def normalize_x(data):
data = data.astype(np.float)
return (data - xmin) / (xmax - xmin)
def normalize_y(data):
data = data.astype(np.float)
return (data - ymin) / (ymax - ymin)
x_new, xi_new = normalize_x(x), normalize_x(xi)
y_new, yi_new = normalize_y(y), normalize_y(yi)
# Interpolate using delaunay triangularization
zi = mlab.griddata(x_new, y_new, z, xi_new, yi_new)
# Plot the results
plt.figure()
plt.pcolormesh(xi,yi,zi)
plt.scatter(x,y,c=z)
plt.colorbar()
plt.axis([xmin, xmax, ymin, ymax])
plt.show()
Надеюсь, что это поможет, во всяком случае... Извините за длину ответа!