如何从特定元素获取 matrix/grid 的对角线元素?
How do I get the diagonal elements of a matrix/grid from a specific element?
我有一个 8x8 的不同数字网格,我想获取包含给定起始位置的对角线元素。这是一个例子
l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]
>> [
[1 5 2 8 6 9 6 8]
[2 2 2 2 8 2 2 1]
[9 5 9 6 8 2 7 2]
[2 8 8 6 4 1 8 1]
[2 5 5 5 4 4 7 9]
[3 9 8 8 9 4 1 1]
[8 9 2 4 2 8 4 3]
[4 4 7 8 7 5 3 6]
]
我将如何从位置 x=4 和 y=3 获取对角线(因此该列表中的第 4 个列表和第 5 个元素)?所以我想要的对角线是 [5,2,6,4,4,1,3]。
这是我想到的。它不漂亮,但它完成了工作。
def get_diagonal(full_grid, y, x):
if x > y:
while y >= 1:
x -= 1
y -= 1
else:
while x >= 1:
x -= 1
y -= 1
diagonal = []
while x < len(grid) and y < len(grid[0]):
diagonal.append(grid[x][y])
x += 1
y += 1
return diagonal
grid = [
[1, 5, 2, 8, 6, 9, 6, 8],
[2, 2, 2, 2, 8, 2, 2, 1],
[9, 5, 9, 6, 8, 2, 7, 2],
[2, 8, 8, 6, 4, 1, 8, 1],
[2, 5, 5, 5, 4, 4, 7, 9],
[3, 9, 8, 8, 9, 4, 1, 1],
[8, 9, 2, 4, 2, 8, 4, 3],
[4, 4, 7, 8, 7, 5, 3, 6]]
get_diagonal(grid, 5, 3)
可以根据x
和y
的差计算对角线左上项的行和列,根据下面的差计算迭代次数两个边界以及起始行和列中较高者:
def diagonal(m, x, y):
row = max((y - x, 0))
col = max((x - y, 0))
for i in range(min((len(m), len(m[0]))) - max((row, col))):
yield m[row + i][col + i]
这样:
m = [
[1, 5, 2, 8, 6, 9, 6, 8],
[2, 2, 2, 2, 8, 2, 2, 1],
[9, 5, 9, 6, 8, 2, 7, 2],
[2, 8, 8, 6, 4, 1, 8, 1],
[2, 5, 5, 5, 4, 4, 7, 9],
[3, 9, 8, 8, 9, 4, 1, 1],
[8, 9, 2, 4, 2, 8, 4, 3],
[4, 4, 7, 8, 7, 5, 3, 6],
]
print(list(diagonal(m, 4, 3)))
输出:
[5, 2, 6, 4, 4, 1, 3]
沿行使用 "y" 而沿垂直使用 "x" 对我来说似乎违反直觉,所以我交换了它们。如果您同意从零开始索引,那么这对我有用:
from random import randint
l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]
# Show the grid
for row in l:
print(' '.join([str(n) for n in row]))
# Give the initial position, then follow the diagonal down and
# to the right until you run out of rows or columns.
x_pos = 1
y_pos = 3
diag = []
while x_pos < len(l[0]) and y_pos < len(l):
diag.append(l[y_pos][x_pos])
x_pos += 1
y_pos += 1
print(diag)
示例输出:
1 3 8 7 3 1 5 2
4 5 8 6 9 4 3 2
2 6 1 3 8 6 8 1
7 1 8 2 7 4 7 4
9 5 5 5 5 2 3 1
8 5 9 7 2 7 1 8
3 3 3 4 2 9 8 3
3 2 8 6 2 4 4 8
['1', '5', '7', '2', '4']
根据@blhsing 的回答,我认为迭代次数应该是 min(len(m) - 1 - row, len(m[0]) - 1 - col)
。
我们来看一个例子:
想象一个有 2 行的矩阵:
[
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
]
假设起点是第一行,元素编号四,如果我们使用原始计算(即 min((len(m), len(m[0]))) - max((row, col))
),我们将 end-up with (min(2,5) - 最大值 (0, 3)) = 2 - 3 = -1.
如果我们使用建议的一个(min(len(m) - 1 - row, len(m[0]) - 1 - col)
),我们将有 min(2 - 1 - 0, 5 - 1 - 3) = min(1, 1) = 1。
我有一个 8x8 的不同数字网格,我想获取包含给定起始位置的对角线元素。这是一个例子
l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]
>> [
[1 5 2 8 6 9 6 8]
[2 2 2 2 8 2 2 1]
[9 5 9 6 8 2 7 2]
[2 8 8 6 4 1 8 1]
[2 5 5 5 4 4 7 9]
[3 9 8 8 9 4 1 1]
[8 9 2 4 2 8 4 3]
[4 4 7 8 7 5 3 6]
]
我将如何从位置 x=4 和 y=3 获取对角线(因此该列表中的第 4 个列表和第 5 个元素)?所以我想要的对角线是 [5,2,6,4,4,1,3]。
这是我想到的。它不漂亮,但它完成了工作。
def get_diagonal(full_grid, y, x):
if x > y:
while y >= 1:
x -= 1
y -= 1
else:
while x >= 1:
x -= 1
y -= 1
diagonal = []
while x < len(grid) and y < len(grid[0]):
diagonal.append(grid[x][y])
x += 1
y += 1
return diagonal
grid = [
[1, 5, 2, 8, 6, 9, 6, 8],
[2, 2, 2, 2, 8, 2, 2, 1],
[9, 5, 9, 6, 8, 2, 7, 2],
[2, 8, 8, 6, 4, 1, 8, 1],
[2, 5, 5, 5, 4, 4, 7, 9],
[3, 9, 8, 8, 9, 4, 1, 1],
[8, 9, 2, 4, 2, 8, 4, 3],
[4, 4, 7, 8, 7, 5, 3, 6]]
get_diagonal(grid, 5, 3)
可以根据x
和y
的差计算对角线左上项的行和列,根据下面的差计算迭代次数两个边界以及起始行和列中较高者:
def diagonal(m, x, y):
row = max((y - x, 0))
col = max((x - y, 0))
for i in range(min((len(m), len(m[0]))) - max((row, col))):
yield m[row + i][col + i]
这样:
m = [
[1, 5, 2, 8, 6, 9, 6, 8],
[2, 2, 2, 2, 8, 2, 2, 1],
[9, 5, 9, 6, 8, 2, 7, 2],
[2, 8, 8, 6, 4, 1, 8, 1],
[2, 5, 5, 5, 4, 4, 7, 9],
[3, 9, 8, 8, 9, 4, 1, 1],
[8, 9, 2, 4, 2, 8, 4, 3],
[4, 4, 7, 8, 7, 5, 3, 6],
]
print(list(diagonal(m, 4, 3)))
输出:
[5, 2, 6, 4, 4, 1, 3]
沿行使用 "y" 而沿垂直使用 "x" 对我来说似乎违反直觉,所以我交换了它们。如果您同意从零开始索引,那么这对我有用:
from random import randint
l = [[str(randint(1,9)) for i in range(8)] for n in range(8)]
# Show the grid
for row in l:
print(' '.join([str(n) for n in row]))
# Give the initial position, then follow the diagonal down and
# to the right until you run out of rows or columns.
x_pos = 1
y_pos = 3
diag = []
while x_pos < len(l[0]) and y_pos < len(l):
diag.append(l[y_pos][x_pos])
x_pos += 1
y_pos += 1
print(diag)
示例输出:
1 3 8 7 3 1 5 2
4 5 8 6 9 4 3 2
2 6 1 3 8 6 8 1
7 1 8 2 7 4 7 4
9 5 5 5 5 2 3 1
8 5 9 7 2 7 1 8
3 3 3 4 2 9 8 3
3 2 8 6 2 4 4 8
['1', '5', '7', '2', '4']
根据@blhsing 的回答,我认为迭代次数应该是 min(len(m) - 1 - row, len(m[0]) - 1 - col)
。
我们来看一个例子: 想象一个有 2 行的矩阵:
[
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
]
假设起点是第一行,元素编号四,如果我们使用原始计算(即 min((len(m), len(m[0]))) - max((row, col))
),我们将 end-up with (min(2,5) - 最大值 (0, 3)) = 2 - 3 = -1.
如果我们使用建议的一个(min(len(m) - 1 - row, len(m[0]) - 1 - col)
),我们将有 min(2 - 1 - 0, 5 - 1 - 3) = min(1, 1) = 1。