Нашли ошибку?
среднийNumPy 2.5.3

Сетки: meshgrid

Получить координаты всех точек прямоугольной сетки, чтобы посчитать функцию двух переменных без циклов.

Нужно знать:Транслирование (broadcasting)Создание массивов

Содержание статьи

Коротко

  • X, Y = np.meshgrid(x, y) возвращает две матрицы: в X координата x каждой точки сетки, в Y — координата y.
  • По умолчанию (indexing="xy") форма результата (len(y), len(x)): строки соответствуют y, как на графике. indexing="ij" даёт (len(x), len(y)), как у матриц.
  • Дальше функция считается поэлементно: np.sqrt(X**2 + Y**2).
  • sparse=True возвращает строку и столбец без повторов — экономит память, а транслирование восстанавливает полную сетку.
  • np.mgrid[0:3, 0:4] — сетка индексов через срезы; np.ogrid — её разреженный вариант.

Синтаксис

X, Y = np.meshgrid(x, y, indexing="xy", sparse=False)
np.mgrid[start:stop:step, start:stop:step]
np.ogrid[0:3, 0:4]

Параметры

ПараметрЧто делаетПо умолчанию
indexing"xy" — форма (len(y), len(x)), "ij" — форма (len(x), len(y))"xy"
sparseвернуть массивы формы (1, n) и (m, 1) вместо полных матрицFalse

Примеры

Данные для примеровиспользуются во всех примерах ниже
x = np.array([0, 1, 2, 3])   # 4 точки по горизонтали
y = np.array([10, 20, 30])   # 3 точки по вертикали
Две матрицы координат
X, Y = np.meshgrid(x, y)
print(X)
Y
Вывод
[[0 1 2 3]
 [0 1 2 3]
 [0 1 2 3]]
array([[10, 10, 10, 10],
       [20, 20, 20, 20],
       [30, 30, 30, 30]])
Функция на сетке
X, Y = np.meshgrid(x, y)
X + Y                        # значение функции в каждой точке сетки
Вывод
array([[10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33]])
Разреженная сетка
X, Y = np.meshgrid(x, y, sparse=True)
print(X.shape, Y.shape)      # без повторов: транслирование сделает остальное
X + Y
Вывод
(1, 4) (3, 1)
array([[10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33]])
То же через транслирование
x[np.newaxis, :] + y[:, np.newaxis]   # тот же результат без meshgrid
Вывод
array([[10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33]])
mgrid: сетка индексов
rows, cols = np.mgrid[0:2, 0:3]       # сетка индексов по срезам
print(rows)
cols
Вывод
[[0 0 0]
 [1 1 1]]
array([[0, 1, 2],
       [0, 1, 2]])
Точки внутри круга
X, Y = np.meshgrid(np.linspace(-1, 1, 5), np.linspace(-1, 1, 5))
(np.sqrt(X**2 + Y**2) <= 1).astype(int)   # точки внутри круга радиуса 1
Вывод
array([[0, 0, 1, 0, 0],
       [0, 1, 1, 1, 0],
       [1, 1, 1, 1, 1],
       [0, 1, 1, 1, 0],
       [0, 0, 1, 0, 0]])

Подводные камни

Форма (len(y), len(x)), а не наоборот

При indexing="xy" первая ось — y. Если дальше вы индексируете X[i, j] как «i-я точка по x», используйте indexing="ij".

indexing='ij'
X, Y = np.meshgrid(x, y, indexing="ij")
X.shape, Y.shape             # (len(x), len(y)) вместо (len(y), len(x))
Вывод
((4, 3), (4, 3))