Коротко
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]])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".
X, Y = np.meshgrid(x, y, indexing="ij")
X.shape, Y.shape # (len(x), len(y)) вместо (len(y), len(x))Вывод
((4, 3), (4, 3))