2013-09-20 5 views
4

У меня есть массив формы (201,201), я хотел бы построить несколько сечений по данным, но у меня возникают проблемы с доступом к соответствующим точкам. Например, я хочу, чтобы построить сечение заданного линии на рисунке производимого,Сечение участка по тепловой карте

from pylab import * 
Z = randn(201,201) 
x = linspace(-1,1,201) 
X,Y = meshgrid(x,x) 
pcolormesh(X,Y,Z) 
plot(x,x*.5) 

Я хотел бы, чтобы построить их на различных направлениях, но они всегда будут проходить через начало координат, если это помогает ..

+0

Вы можете написать код со всем импортом? –

ответ

5

В принципе, вы хотите интерполировать 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() 

enter image description here

С другой стороны, мы могли бы использовать ближайшего соседа интерполяция. Один из способов сделать это - пройти 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)] 

Мы получим:

enter image description here

+0

спасибо, что кубический пример интерполяции - именно то, что мне нужно. – Dave

Смежные вопросы