查找 Python 2D 数组/矩阵的所有"eight directions"中的元素索引



如何找到给定2D矩阵/阵列的所有八个方向(左、右、上、下、左上、右上、左下、右下(上所有元素的索引?

例如,在下面给定的矩阵中,我希望为输入0提取标记为X的元素,依此类推…:

X**X**X
*X*X*X*
**XXX**
XXX0XXX
**XXX**
X0XXXXX
XXX****
*X*X***
*X**X**
*X***X*

我使用这个lambda函数来获得所有八个方向上所有相邻元素的列表。

X = len(grid)
Y = len(grid[0])
neighbors = lambda x, y : [(x2, y2) for x2 in range(x-1, x+2)
for y2 in range(y-1, y+2)
if (-1 < x < X and
-1 < y < Y and
(x != x2 or y != y2) and
(0 <= x2 < X) and
(0 <= y2 < Y))]
**XXX**
**X0X**
**XXX**
*******

我希望能够扩展以上内容以获得以上内容。

以下将提供所有八个方向的索引:

from itertools import product
def valid_indexes(lst, row, col):
return row in range(len(lst)) and col in range(len(lst[0]))
# Queen's view since it's the same as what a queen in chess can 'view'
def queens_view(lst, row, col, dr=0, dc=0):
if dr or dc:
yield (row, col)
if valid_indexes(lst, row+dr, col+dc):
yield from queens_view(lst, row+dr, col+dc, dr, dc)
else:
for dr, dc in product([-1, 0, 1], [-1, 0, 1]):
if dr or dc and valid_indexes(lst, row+dr, col+dc):
yield from queens_view(lst, row+dr, col+dc, dr, dc)
start_row, start_col = 3, 4 # Index of the '0' in your list
for row, col in queens_view(lst, start_row, start_col):
print(row, col)
# Do what you like with the index

您可以创建一个函数,从所需的点向各个方向"射击",直到到达网格的末端。返回所有找到的点:

def direction_points(g_len_x, g_len_y, point_x, point_y):
result = []
directions = [
[0, -1],    # up
[1, -1],    # up right
[1, 0],     # right
[1, 1],     # down right
[0, 1],     # down
[-1, 1],    # down left
[-1, 0],    # left
[-1, -1],   # left up
]
for direction in directions:
x = point_x
y = point_y
end_reached = False
while not end_reached:
x = x + direction[0]
y = y + direction[1]
if (0 <= x < g_len_x) and not end_reached:
if (0 <= y < g_len_y) and not end_reached:
result.append([x, y])
else:
end_reached = True
else:
end_reached = True
return result

有了它,你可以创建线条或网格:

grid_len_x = 10
grid_len_y = 12
mid_point_x = 4
mid_point_y = 6
points = direction_points(grid_len_x, grid_len_y, mid_point_x, mid_point_y)
lines = []
for y in range(grid_len_y):
line = ''
for x in range(grid_len_x):
if [x, y] in points:
line += 'X'
else:
if x == mid_point_x and y == mid_point_y:
line += '0'
else:
line += '*'
lines.append(line)
for line in lines:
print(line)

结果

****X*****
****X****X
X***X***X*
*X**X**X**
**X*X*X***
***XXX****
XXXX0XXXXX
***XXX****
**X*X*X***
*X**X**X**
X***X***X*
****X****X

最新更新