map_coordinates
предполагает, что у вас есть элементы с каждым целочисленным индексом, как на изображении.Т.е. (0, 0), (0, 1) ..., (0, 100), (1, 0), (1, 1), ..., (100, 0), (100, 1),..., (100, 100) - все координаты, которые хорошо определены, если у вас есть изображение 100x100.Это не твой случай.У вас есть данные в координатах (12, 127.1), (12, 132.3) и т. Д.
Вместо них можно использовать griddata
.В зависимости от того, как вы хотите интерполировать, вы получите разные результаты:
In [24]: data = np.array([[12, 127.1, 2800], [12, 132.3, 3400.23], [12, 154.3, 5000.1], [12, 171.1, 6880.7],
...: [12, 190.7, 9711.1], [12, 195.3, 10011.2],
...: [14, 113.1, 2420], [14, 125.3, 3320], [14, 133.3, 4129.91], [14, 155.1, 6287.17],
...: [14, 187.7, 10800.34], [14, 197.3, 13076.5]])
In [25]: from scipy.interpolate import griddata
In [28]: coords = np.array([[12.2, 122.1], [12.4, 137.3], [12.5, 154.9], [12.6, 171.4], [12.7, 192.6], [12.8, 198.5]])
In [29]: griddata(data[:, 0:2], data[:, -1], coords)
Out[29]:
array([ nan, 3895.22854545, 5366.64369048, 7408.68906748,
10791.779 , nan])
In [31]: griddata(data[:, 0:2], data[:, -1], coords, method='nearest')
Out[31]: array([ 3320. , 4129.91, 5000.1 , 6880.7 , 9711.1 , 13076.5 ])
In [32]: griddata(data[:, 0:2], data[:, -1], coords, method='cubic')
Out[32]:
array([ nan, 3998.75479082, 5357.54672326, 7297.94115979,
10647.04183455, nan])
method='cubic'
, вероятно, имеет самую высокую точность для "случайных" данных, но только вы можете решить, какой метод подходит для ваших данныхи что вы пытаетесь сделать (по умолчанию method='linear'
, используется в [29]
выше).
Обратите внимание, что некоторые из ответов nan
.Это потому, что вы дали ввод, который находится не внутри «ограничивающего многоугольника», который ваши точки образуют в 2D-пространстве.
Вот визуализация, чтобы показать вам, что я имею в виду:
In [49]: x = plt.scatter(x=np.append(data[:, 0], [12.2, 12.8]), y=np.append(data[:, 1], [122.1, 198.5]), c=['green']*len(data[:, 0]) + ['red']*2)
In [50]: plt.show()
Я не соединял точки зеленого цвета, но вы можете видеть, что две точки красного цвета находятся за пределами многоугольника, который был бы сформирован, если бы я соединил эти точки.точек.Вы не можете интерполировать за пределами этого диапазона, поэтому вы получите nan
.Чтобы понять почему, рассмотрим 1D случай.Если я спрошу вас, какое значение имеет индекс 2.5 [0,1,2,3]
, разумный ответ будет 2.5
.Однако, если я спрашиваю, что находится на значении индекса 100 ... априори мы не имеем представления, что на уровне 100, это слишком далеко за пределами диапазона того, что вы можете видеть.Поэтому мы не можем дать ответ.Сказать, что это 100
, неправильно для этой функции, поскольку это будет экстраполяция , а не интерполяция .
HTH.