#python #matplotlib
#python #matplotlib
Вопрос:
обычно я работаю с данными изображения, которые находятся в массивах в форме m x n. Отображение легко, верно?
import numpy as np
import matplotlib.pyplot as plt
#sample data
m,n = 10,20
sample = np.random.random((m,n))
plt.imshow(sample)
из другого алгоритма я теперь получаю данные, которые имеют x, y, данные из другой формы, как m, n, но в том же диапазоне. Позвольте мне сгенерировать некоторый пример, чтобы лучше объяснить.
k = 300
x = np.random.random((k,)) * m
y = np.random.random((k,)) * n
data = np.random.random((k,))
Я хочу сделать две вещи, которые я не понимаю.
1) Отображение данных в стиле imshow
2) Для лучшей сопоставимости интерполируйте данные по прямоугольной сетке m, n, то есть генерируйте массив формы m, n со значениями из данных (например, «ближайший»).
На самом деле я использую scipy.ndimage.map_coordinates, чтобы сделать все наоборот, но не могу заставить его работать в обратном направлении…
Приветствия
Комментарии:
1. Я бы разделил это на два вопроса. Я думаю
interp2d
, делает то, что вы хотите docs.scipy.org/doc/scipy/reference/interpolate.html2. Я бы также предложил
interp2d
. Что касается вашего первого вопроса: вы всегда можете использоватьplt.pcolormesh(x, y, data)
для построения неоднородных данных.3. Я не мог заставить их работать. interp2d выходит из строя с большими данными и не создает хорошо подготовленную функцию для небольших данных. pcolormesh не будет работать с формой входных данных
Ответ №1:
Ниже приведен слегка измененный пример использования scipy.interpolate.griddata:
import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
k = 300
m, n = 10, 20
x = np.random.random((k,)) * m
y = np.random.random((k,)) * n
data = np.random.random((k,))
grid_x, grid_y = np.mgrid[0:m 1, 0:n 1]
grid_z0 = griddata((x, y), data, (grid_x, grid_y), method='nearest')
grid_z1 = griddata((x, y), data, (grid_x, grid_y), method='linear')
grid_z2 = griddata((x, y), data, (grid_x, grid_y), method='cubic')
plt.subplot(131)
plt.imshow(grid_z0.T)
plt.title('Nearest')
plt.subplot(132)
plt.imshow(grid_z1.T)
plt.title('Linear')
plt.subplot(133)
plt.imshow(grid_z2.T)
plt.title('Cubic')
plt.gcf().set_size_inches(6, 6)
plt.show()
Комментарии:
1. Работает как шарм, идеально! Только cubic дает мне несколько интересных «лучей» в областях с большими градиентами, но это, безусловно, мои данные. Linear идеален и по-прежнему быстр с точками данных 1e6