Вы можете использовать np.ogrid
с мнимым «шагом» для получения семантики linspace:
y, x = np.ogrid[0:1:2j, 0:1:3j]
y + 1j*x
# array([[0.+0.j , 0.+0.5j, 0.+1.j ],
# [1.+0.j , 1.+0.5j, 1.+1.j ]])
Здесь линия ogrid
означает создание открытой 2D-сетки.ось от 0: 0 до 1, 2 шага, ось от 1: 0 до 1, 3 шага.Тип фрагмента «step» действует как переключатель, если он является мнимым (на самом деле что-либо сложного типа), его абсолютное значение берется, а выражение обрабатывается как linspace.В противном случае применяется семантика диапазона.
Возвращаемые значения
y, x
# (array([[0.],
# [1.]]), array([[0. , 0.5, 1. ]]))
"готовы к трансляции", поэтому в примере мы можем просто добавить их и получить полную 2D-сетку.
Если мы позволим себе воображаемый параметр «stop» во втором срезе (который работает только с семантикой linspace, поэтому в зависимости от вашего стиля вы можете предпочесть его избегать), он может быть сжат до одной строки:
sum(np.ogrid[0:1:2j, 0:1j:3j])
# array([[0.+0.j , 0.+0.5j, 0.+1.j ],
# [1.+0.j , 1.+0.5j, 1.+1.j ]])
Аналогичным, но потенциально более производительным методом будет предварительное распределение, а затем трансляция:
out = np.empty((y.size, x.size), complex)
out.real[...], out.imag[...] = y, x
out
# array([[0.+0.j , 0.+0.5j, 0.+1.j ],
# [1.+0.j , 1.+0.5j, 1.+1.j ]])
И еще один, использующий внешнюю сумму:
np.add.outer(np.linspace(0,1,2), np.linspace(0,1j,3))
# array([[0.+0.j , 0.+0.5j, 0.+1.j ],
# [1.+0.j , 1.+0.5j, 1.+1.j ]])