В принципе, вы хотите интерполировать 2D-сетку вдоль линии (или произвольного пути).
Прежде всего, вы должны решить, хотите ли вы интерполировать сетку или просто выполнить выборку ближайших соседей. Если вы хотите сделать последнее, вы можете просто использовать индексирование.
Если вы хотите интерполировать, взгляните на scipy.ndimage.map_coordinates
. Сначала немного обернуть голову, но это идеально подходит для этого. (Это намного эффективнее, чем использование интерполяционной процедуры, предполагающей, что точки данных распределены случайным образом.)
Приведу пример того и другого. Они адаптированы из answer I gave to another question. Однако в этих примерах все построено в координатах «пиксель» (например, строка, столбец).
В вашем случае вы работаете в другой системе координат, чем координаты «пикселя», поэтому вам нужно будет преобразовать из координат «мир» (т.е. x, y) в «пиксельные» координаты для интерполяции ,
Во-первых, вот пример использования кубической интерполяции с map_coordinates
:
import numpy as np
import scipy.ndimage
import matplotlib.pyplot as plt
# Generate some data...
x, y = np.mgrid[-5:5:0.1, -5:5:0.1]
z = np.sqrt(x**2 + y**2) + np.sin(x**2 + y**2)
# Coordinates of the line we'd like to sample along
line = [(-3, -1), (4, 3)]
# Convert the line to pixel/index coordinates
x_world, y_world = np.array(zip(*line))
col = z.shape[1] * (x_world - x.min())/x.ptp()
row = z.shape[0] * (y_world - y.min())/y.ptp()
# Interpolate the line at "num" points...
num = 1000
row, col = [np.linspace(item[0], item[1], num) for item in [row, col]]
# Extract the values along the line, using cubic interpolation
zi = scipy.ndimage.map_coordinates(z, np.vstack((row, col)))
# Plot...
fig, axes = plt.subplots(nrows=2)
axes[0].pcolormesh(x, y, z)
axes[0].plot(x_world, y_world, 'ro-')
axes[0].axis('image')
axes[1].plot(zi)
plt.show()
С другой стороны, мы могли бы использовать ближайшего соседа интерполяция. Один из способов сделать это - пройти order=0
до map_coordinates
в приведенном выше примере. Вместо этого я буду использовать индексирование, чтобы показать другой подход. Если мы просто изменить линию
# Extract the values along the line, using cubic interpolation
zi = scipy.ndimage.map_coordinates(z, np.vstack((row, col)))
To:
# Extract the values along the line, using nearest-neighbor interpolation
zi = z[row.astype(int), col.astype(int)]
Мы получим:
Вы можете написать код со всем импортом? –