Цель meshgrid
состоит в том, чтобы создать прямоугольную сетку из массива значений x и массива значений y.
Так, например, если мы хотим создать сетку, в которой у нас есть точка при каждом целочисленном значении между 0 и 4 в направлениях x и y. Для того, чтобы создать прямоугольную сетку, мы должны каждую комбинацию из x
и y
точек.
Это будет 25 очков, верно? Так что, если мы хотим создать й и у массива для всех этих точек, мы могли бы сделать следующее.
x[0,0] = 0 y[0,0] = 0
x[0,1] = 1 y[0,1] = 0
x[0,2] = 2 y[0,2] = 0
x[0,3] = 3 y[0,3] = 0
x[0,4] = 4 y[0,4] = 0
x[1,0] = 0 y[1,0] = 1
x[1,1] = 1 y[1,1] = 1
...
x[4,3] = 3 y[4,3] = 4
x[4,4] = 4 y[4,4] = 4
Это привело бы к следующему x
и y
матрицам, так что спаривание соответствующего элемента в каждой матрице дает координаты x и y точки в сетке.
x = 0 1 2 3 4 y = 0 0 0 0 0
0 1 2 3 4 1 1 1 1 1
0 1 2 3 4 2 2 2 2 2
0 1 2 3 4 3 3 3 3 3
0 1 2 3 4 4 4 4 4 4
Затем мы можем построить их, чтобы убедиться, что они являются сеткой:
plt.plot(x,y, marker='.', color='k', linestyle='none')
Очевидно, что это становится очень утомительным, особенно для больших диапазонов x
и y
. Вместо этого мы meshgrid
можем сгенерировать это для нас: все, что мы должны указать, это уникальность x
и y
значения.
xvalues = np.array([0, 1, 2, 3, 4]);
yvalues = np.array([0, 1, 2, 3, 4]);
Теперь, когда мы вызываем meshgrid
, мы автоматически получаем предыдущий вывод.
xx, yy = np.meshgrid(xvalues, yvalues)
plt.plot(xx, yy, marker='.', color='k', linestyle='none')
Создание этих прямоугольных сеток полезно для ряда задач. В примере, который вы предоставили в своем посте, это просто способ сэмплировать функцию ( sin(x**2 + y**2) / (x**2 + y**2)
) по диапазону значений для x
и y
.
Поскольку эта функция была выбрана на прямоугольной сетке, функцию теперь можно визуализировать как «изображение».
Кроме того, теперь результат можно передать функциям, которые ожидают данные в прямоугольной сетке (т.е. contourf
)
xx
иyy
. Для меня загадочной частью было то, почему он возвращает ту пару результатов и как они выглядят. Ответ Хай Фана удобен для этого. Я полагаю, это сделано для удобства, так как plot хочет два таких параметра.xx = [xvalues for y in yvalues]
yy = [[y for x in xvalues] for y in yvalues]
x
иy
назад? Когда вы делаетеxx, yy = np.meshgrid(np.arange(4), np.arange(4))
, это обратное тому, что у вас есть,x
иy
в первой части ответа. Он соответствует порядку выходных данных дляmgrid
, но не для сетки. Значениеxx
должно увеличиваться в направлении x, а ваше - в направлении y.Предоставлено Microsoft Excel:
источник
XYpairs = np.vstack([ XX.reshape(-1), YY.reshape(-1) ])
XYpairs = np.dstack([XX, YY]).reshape(-1, 2)
np.vstack([XX.ravel(), YY.ravel()]).T
На самом деле цель
np.meshgrid
уже упоминается в документации:Поэтому его основная цель состоит в создании координатных матриц.
Вы, наверное, просто спросили себя:
Зачем нам нужно создавать координатные матрицы?
Причина, по которой вам нужны координатные матрицы с Python / NumPy, заключается в том, что нет прямой связи между координатами и значениями, кроме случаев, когда ваши координаты начинаются с нуля и являются чисто положительными целыми числами. Тогда вы можете просто использовать индексы массива в качестве индекса. Однако, когда это не так, вам нужно как-то хранить координаты вместе с вашими данными. Вот где приходят сетки.
Предположим, ваши данные:
Однако каждое значение представляет область шириной 2 километра по горизонтали и 3 километра по вертикали. Предположим, ваше происхождение - это верхний левый угол, и вы хотите, чтобы массивы представляли расстояние, которое вы могли бы использовать:
где v это:
и ч:
Итак, если у вас есть два индекса, скажем,
x
иy
(именно поэтому возвращаемое значениеmeshgrid
обычноxx
илиxs
вместо того, чтоx
в этом случае я выбралh
для горизонтали!), То вы можете получить координату x точки, координату y точки и значение в этой точке с помощью:Это значительно облегчает отслеживание координат и (что еще более важно) вы можете передавать их функциям, которые должны знать координаты.
Немного более длинное объяснение
Тем не менее,
np.meshgrid
сам по себе не часто используется напрямую, в основном один просто использует один из похожих объектовnp.mgrid
илиnp.ogrid
. Здесьnp.mgrid
представляет собойsparse=False
иnp.ogrid
вsparse=True
случае (я ссылаться наsparse
аргументnp.meshgrid
). Обратите внимание, что междуnp.meshgrid
andnp.ogrid
и есть существенная разницаnp.mgrid
: первые два возвращаемых значения (если их два или более) меняются местами. Часто это не имеет значения, но вы должны давать значимые имена переменных в зависимости от контекста.Например, в случае двумерной сетки
matplotlib.pyplot.imshow
имеет смысл назвать первый возвращаемый элементnp.meshgrid
x
и второй, вy
то время как дляnp.mgrid
и наоборотnp.ogrid
.np.ogrid
и разреженные сеткиКак уже говорилось, результат по сравнению с обратным
np.meshgrid
, поэтому я распаковал егоyy, xx
вместоxx, yy
:Это уже выглядит как координаты, в частности, линии x и y для 2D-графиков.
Визуализация:
np.mgrid
и плотные / плотные сеткиТо же самое применимо и здесь: результат обратный по сравнению с
np.meshgrid
:В отличие от
ogrid
этих массивов все содержатxx
иyy
координаты в -5 <= xx <= 5; -5 <= yy <= 5 сетки.функциональность
Это не ограничивается только 2D, эти функции работают для произвольных измерений (ну, в Python есть максимальное количество аргументов для функции и максимальное количество измерений, которое допускает NumPy):
Даже если они также работают для 1D, есть две (гораздо более распространенные) функции создания сетки 1D:
np.arange
np.linspace
Помимо аргумента
start
andstop
он также поддерживаетstep
аргумент (даже сложные шаги, которые представляют количество шагов):Приложения
Вы специально спросили о цели, и на самом деле, эти сетки очень полезны, если вам нужна система координат.
Например, если у вас есть функция NumPy, которая вычисляет расстояние в двух измерениях:
И вы хотите знать расстояние каждой точки:
Вывод был бы идентичен, если бы он проходил в плотной сетке вместо открытой сетки. Вещание NumPys делает это возможным!
Давайте представим результат:
И это также, когда NumPys
mgrid
иogrid
становится очень удобным, потому что позволяет легко изменять разрешение ваших сеток:Однако, поскольку
imshow
не поддерживаетx
иy
вводит, нужно поменять галочки вручную. Было бы очень удобно , если она будет приниматьx
иy
координаты, не так ли?С помощью NumPy легко написать функции, которые естественно работают с сетками. Кроме того, в NumPy, SciPy, matplotlib есть несколько функций, которые ожидают, что вы перейдете в таблицу.
Мне нравятся изображения, поэтому давайте рассмотрим
matplotlib.pyplot.contour
:Обратите внимание, что координаты уже установлены правильно! Это не было бы так, если бы вы только что прошли в
density
.Или дать еще один пример прикольный используя astropy модели ( на этот раз я не забочусь много о координатах, я просто использовать их , чтобы создать некоторую сетку):
Хотя это просто "для внешнего вида", некоторые функции, связанные с функциональными моделями и примеркой (например
scipy.interpolate.interp2d
,scipy.interpolate.griddata
даже показывать примеры использованияnp.mgrid
) в Scipy и т. Д., Требуют сеток. Большинство из них работают с открытыми сетками и плотными сетками, однако некоторые работают только с одним из них.источник
h, v = np.meshgrid(np.arange(3)*3, np.arange(3)*2)
- поскольку его 2 км по горизонтали и 3 км по вертикали, не следует ли умножить первый диапазон на 2, а второй на 3?Предположим, у вас есть функция:
и вы хотите, например, посмотреть, как это выглядит в диапазоне от 0 до 2 * пи. Как бы вы это сделали? Там
np.meshgrid
входит:и такой сюжет будет выглядеть так:
Так что
np.meshgrid
это просто удобство. В принципе то же самое может быть сделано:но там вы должны знать о своих измерениях (предположим, у вас есть более двух ...) и правильное вещание.
np.meshgrid
делает все это для вас.Также meshgrid позволяет вам удалять координаты вместе с данными, если вы, например, хотите выполнить интерполяцию, но исключить определенные значения:
так как бы вы сделали сейчас интерполяцию? Вы можете дать
x
иy
для функции интерполяции , какscipy.interpolate.interp2d
так вам нужен способ , чтобы знать , какие координаты были удалены:и тогда вы все еще можете интерполировать с «правильными» координатами (попробуйте без сетки, и у вас будет много дополнительного кода):
и оригинальная сетка позволяет вам снова получить интерполяцию на исходной сетке:
Это всего лишь несколько примеров, где я использовал,
meshgrid
может быть гораздо больше.источник
xx
,yy
. Трудно было понять, что это такое и почему мы используем их для вычисления функции. Кажется, я понял. Мы хотим вычислить некоторую функцию на основе координат. Мы можем написать что-то вроде этого:for x=1:10: for y=1:10: z[x,y]=sin(x)+sin(y)
вместо этого мы рассчитываемz
по-другомуz=sin([x,x,...,x]) + sin([y,y,..y])
. Поправь меня, если я ошибаюсь!numpy
: с помощью сетки или трансляции. Если вы не отбрасываете баллы (см. Последнюю часть моего ответа), то оба на самом деле функционально эквивалентны. Вещание - это просто неявный цикл в измерении, которое будет транслироваться. Обратите внимание, что я использовал[:,None]
и[None, :]
включить дополнительные измерения, чтобы результат транслировался правильно. Ваш второй пример больше похож на:sin([[y],[y],..[y]])
interpolated_grid = interpolated(xx, yy)
- это не работает для меня, ошибка:x and y should both be 1-D arrays
Сетка mesh помогает создать прямоугольную сетку из двух одномерных массивов всех пар точек из двух массивов.
Теперь, если вы определили функцию f (x, y) и хотите применить эту функцию ко всем возможным комбинациям точек из массивов 'x' и 'y', то вы можете сделать это:
Скажем, если ваша функция просто производит произведение двух элементов, то именно так можно получить декартово произведение, эффективно для больших массивов.
По ссылке отсюда
источник
Основная идея
Учитывая возможные значения x
xs
, (представьте их как отметки на оси x графика) и возможные значения yys
,meshgrid
генерирует соответствующий набор (x, y) точек сетки - аналогичноset((x, y) for x in xs for y in yx)
. Например, еслиxs=[1,2,3]
иys=[4,5,6]
, мы получили бы набор координат{(1,4), (2,4), (3,4), (1,5), (2,5), (3,5), (1,6), (2,6), (3,6)}
.Форма возвращаемого значения
Однако
meshgrid
возвращаемое представление отличается от приведенного выше выражения двумя способами:Во-первых ,
meshgrid
размещает точки сетки в 2d массиве: строки соответствуют разным значениям y, столбцы соответствуют разным значениям x - как вlist(list((x, y) for x in xs) for y in ys)
, что даст следующий массив:Во-вторых ,
meshgrid
возвращает координаты x и y отдельно (т. Е. В двух разных двухмерных массивах numpy):Обратите внимание,
np.meshgrid
также может генерировать сетки для более высоких размеров. Учитывая xs, ys и zs, вы получите xcoords, ycoords, zcoords в виде трехмерных массивов.meshgrid
также поддерживает обратный порядок размеров, а также разреженное представление результата.Приложения
Зачем нам нужна эта форма вывода?
Примените функцию в каждой точке сетки: одна из причин состоит в том, что бинарные операторы, такие как (+, -, *, /, **), перегружаются для массивов с пустыми данными как элементарные операции. Это означает, что, если у меня есть функция,
def f(x, y): return (x - y) ** 2
которая работает с двумя скалярами, я также могу применить ее к двум массивам, чтобы получить массив поэлементных результатов: например,f(xcoords, ycoords)
илиf(*np.meshgrid(xs, ys))
дать следующее в приведенном выше примере:Многомерная внешний продукт: Я не уверен , насколько эффективно это, но вы можете получить многомерный наружные продукты следующим образом:
np.prod(np.meshgrid([1,2,3], [1,2], [1,2,3,4]), axis=0)
.Контурные графики в matplotlib: я сталкивался
meshgrid
при исследовании рисования контурных графиков с помощью matplotlib для построения границ решений . Для этого вы генерируете сетку сmeshgrid
, оцениваете функцию в каждой точке сетки (например, как показано выше), а затем передаете xcoords, ycoords и вычисленные f-значения (то есть zcoords) в функцию contourf.источник