Matplotlib интерполирует / отображает неструктурированные данные

#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.html

2. Я бы также предложил 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