Нахождение края матрицы с помощью индексации - PullRequest
0 голосов
/ 27 мая 2020

У меня есть список списков, который является интерпретацией матрицы. Например:

1 2 3
2 3 4
5 6 7

Я хочу расширить его, чтобы он имел края по углам, значения которых равны -1

-1 -1 -1 -1 -1
-1  1  2  3 -1
-1  2  3  4 -1
-1  5  6  7 -1
-1 -1 -1 -1 -1

Я создал новый список списков, в котором есть еще +2 строки и +2 столбца

Есть ли у людей краткая математическая формула для однострочного оператора if для определения того, элемент находится на «краю».

Я пробовал

i*j == 0

Но он заполняет только левую часть угла.

Я знаю, что это может быть просто сделано с двумя операторами if, но я задаю этот вопрос из любопытства

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Мне нравится приведенный выше модуль. Или вы можете воспользоваться оператором Python any

any([i==0, i==len(mat)-1, j==0, j==len(mat[0])-1])
0 голосов
/ 27 мая 2020

Учитывая входные данные

n = 3
m = [
[1, 2, 3],
[2, 3, 4],
[5, 6, 7]
]

, простой подход будет выглядеть примерно так:

p = [[-1] * (n+2), *([-1] + r + [-1] for r in m), [-1] * (n+2)]

, что дает

[[-1, -1, -1, -1, -1],
 [-1,  1,  2,  3, -1],
 [-1,  2,  3,  4, -1],
 [-1,  5,  6,  7, -1],
 [-1, -1, -1, -1, -1]]

, но если вы хотите сформировать его из индексов (i и j), тогда вы можете использовать составное логическое условие

[[-1 if not (i and j) or not(n+1-i and n+1-j) else m[i-1][j-1] for j in range(n+2)] for i in range(n+2)]

, которое упрощается до

[[-1 if not (i and j and n+1-i and n+1-j) else m[i-1][j-1] for j in range(n+2)] for i in range(n+2)]

, но, вероятно, проще использовать сравнения

[[m[i-1][j-1] if 1 < i < n and 1 < j < n else -1 for j in range(n+2)] for i in range(n+2)]

или с abs():

[[-1 if abs((n+1)/2 - i) == (n+1)/2 or abs((n+1)/2-j) == (n+1)/2 else m[i-1][j-1] for j in range(n+2)] for i in range(n+2)]

, который работает, устанавливая элемент на -1, если расстояние до центра матрицы равно половине ширины матрицы.

0 голосов
/ 27 мая 2020

Я не совсем уверен, хотите ли вы получить доступ к «краевым» элементам после создания расширенной матрицы или вы хотите упростить сам процесс расширения, но ваш вопрос касается первого сценария, поэтому я предполагаю, что он . Если в списке есть n списков длины m (матрица nxm),

(i%(n-1))*(j%(m-1))==0

должно работать, поскольку первая и последняя строки устанавливают первый коэффициент равным 0, а первый и последний столбцы устанавливают второй равным 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...