[Hmmph.@wim побил меня, но я уже написал следующее, так что я все равно выложу.] Короткая версия:
import numpy
N = 5
# get grid coords
xx, yy = numpy.mgrid[0:N,0:N]
# get the distance weights
kernel = 1 + N//2 - numpy.maximum(abs(xx-N//2), abs(yy-N//2))
with open('kernel.out','w') as fp:
# header
fp.write("{} {}\n".format(N, N))
# integer matrix output
numpy.savetxt(fp, kernel, fmt="%d")
, которая выдает
~/coding$ python kernel.py
~/coding$ cat kernel.out
5 5
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Verboseобъяснение магии: первое, что нам понадобится, - это индексы каждой записи в матрице, и для этого мы можем использовать mgrid :
>>> import numpy
>>> N = 5
>>> xx, yy = numpy.mgrid[0:N,0:N]
>>> xx
array([[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2],
[3, 3, 3, 3, 3],
[4, 4, 4, 4, 4]])
>>> yy
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
Итак, взялипопарно, это координаты x и y каждого элемента массива 5x5.Центр будет в N // 2, N // 2 (где // - усеченное деление), поэтому мы можем вычесть это, чтобы получить расстояния, и принять абсолютное значение, потому что нам нет дела до знака:
>>> abs(xx-N//2)
array([[2, 2, 2, 2, 2],
[1, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[2, 2, 2, 2, 2]])
>>> abs(yy-N//2)
array([[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 0, 1, 2]])
Теперь, глядя на исходную сетку, кажется, что вы хотите максимальное значение из двух:
>>> numpy.maximum(abs(xx-N//2), abs(yy-N//2))
array([[2, 2, 2, 2, 2],
[2, 1, 1, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 1, 1, 2],
[2, 2, 2, 2, 2]])
, которое выглядит хорошо, но идет не в ту сторону.Мы можем инвертировать, хотя:
>>> N//2 - numpy.maximum(abs(xx-N//2), abs(yy-N//2))
array([[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 2, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0]])
и вы хотите 1-индексирование, это выглядит так:
>>> 1 + N//2 - numpy.maximum(abs(xx-N//2), abs(yy-N//2))
array([[1, 1, 1, 1, 1],
[1, 2, 2, 2, 1],
[1, 2, 3, 2, 1],
[1, 2, 2, 2, 1],
[1, 1, 1, 1, 1]])
и вот оно у нас.Все остальное скучно в IO.