Как сгенерировать такую матрицу?

Значения от 0 до 1

В итоге должен получиться такой результат:

1.0    1.0    1.0    1.0    1.0

1.0    0.5    0.5    0.5    1.0

1.0    0.5    0.0    0.5    1.0

1.0    0.5    0.5    0.5    1.0

1.0    1.0    1.0    1.0    1.0

Будет проще, если представить в виде цвета

1 - абсолютно белый

0 - абсолютно черный

В таком случае стоит задача генерировать некий квадратный градиент, вот такой

введите сюда описание изображения

Язык не важен, мне бы хотя бы понять алгоритм, буду благодарен за любую помощь)


Ответы (2 шт):

Автор решения: GrAnd

Т.к. матрица симметричная, то достаточно заполнить только её четверть, а потом отзеркалить по горизонтали и по вертикали.

max_value = 1.0
min_value = 0.0
steps = 3

# заготовка для четверти матрицы
quadrant = [[None]*steps for _ in range(steps)]

for start in range(steps):
    value = max_value - ((max_value - min_value) / (steps - 1) * start)
    for pos in range(start, steps):
        # заполняем вертикальный ряд вниз и горизонтальный вправо 
        # от стартовой (текущей) позиции
        quadrant[start][pos] = quadrant[pos][start] = value

# зеркалим по вертикали
matrix = quadrant + quadrant[::-1][1:]
# и по горизонтали
matrix = [row + row[::-1][1:] for row in matrix]

# вуаля :)
print("\n".join("  ".join([f"{elem:.3f}" for elem in row]) for row in matrix))

Получаем:

1.000  1.000  1.000  1.000  1.000
1.000  0.500  0.500  0.500  1.000
1.000  0.500  0.000  0.500  1.000
1.000  0.500  0.500  0.500  1.000
1.000  1.000  1.000  1.000  1.000
→ Ссылка
Автор решения: TigerTV.ru

Делал подобное ранее.

Этот вариант для квадратной матрицы:

def make_matrix(n):
    m = [[0] * n for _ in range(n)]
    half = n // 2 + n % 2
    for i in range(half):
        for j in range(half):
            a = 1 - min(i, j) / (half - 1)
            m[i][j] = a
            m[-i-1][j] = a
            m[-i-1][-j-1] = a
            m[i][-j-1] = a
    return m

x = make_matrix(5)

for row in x:
    print(*[f"{i:.2f}" for i in row])

'''
1.00 1.00 1.00 1.00 1.00
1.00 0.50 0.50 0.50 1.00
1.00 0.50 0.00 0.50 1.00
1.00 0.50 0.50 0.50 1.00
1.00 1.00 1.00 1.00 1.00
'''

еще вариант, сначала создается центральная матрица с нулями, а затем она расширяется по сторонам с определенным шагом:

def make_matrix(n):
    half = n // 2 + n % 2
    if n % 2:
        m = [[0]]
    else:
        m = [[0, 0], [0, 0]]
    v = 0
    step = 1 / (half - 1)
    for x in range(1, half):
        v += step
        for i in m:
            i.insert(0, v)
            i.append(v)
        sz = len(m[0])
        m.insert(0, [v] * sz)   
        m.append([v] * sz)  
    return m
→ Ссылка