如果两个单元格共享边界,则认为它们相邻。 例如:
os.stat
索引为0,0的相邻元素位于索引[0,1]和[1,0],对于索引1,1,相邻元素位于索引[0,1],[1,0],[ 2,1]和[1,2]。
答案 0 :(得分:1)
假设您有m
x n
矩阵,并且要查找单元格的相邻索引(i
,j
):
def get_adjacent_indices(i, j, m, n):
adjacent_indices = []
if i > 0:
adjacent_indices.append((i-1,j))
if i+1 < m:
adjacent_indices.append((i+1,j))
if j > 0:
adjacent_indices.append((i,j-1))
if j+1 < n:
adjacent_indices.append((i,j+1))
return adjacent_indices
答案 1 :(得分:1)
这将是另一种方式 - 概率。涉及一些数学技巧或Pythonic
方式:
def neighbours(grid, r, c):
vals = sum((row[c -(c>0): c+2]
for row in grid[r -(r>0):r+2]), [])
vals.remove(grid[r][c]) # rm itself.
return vals
grid = [[1, 5, 4, 9],
[2, 8, 3, 8],
[6, 3, 6, 3],
[7, 4, 7, 1]]
输出:(所有项目按顺序排列)
print(f' {neighbours(grid, 2, 2)} ') # [8, 3, 8, 3, 3, 4, 7, 1]
print(f' {neighbours(grid, 0, 0)} ') # [5, 2, 8]
print(f' {neighbours(grid, 1, 1)} ') # [[1, 5, 4, 2, 3, 6, 3, 6]
答案 2 :(得分:0)
关于 Casper Dijkstrao 的要求,为了检查对角线,我通常会写一些这样的代码:
def adj_finder(matrix, position):
adj = []
for dx in range(-1, 2):
for dy in range(-1, 2):
rangeX = range(0, matrix.shape[0]) # X bounds
rangeY = range(0, matrix.shape[1]) # Y bounds
(newX, newY) = (position[0]+dx, position[1]+dy) # adjacent cell
if (newX in rangeX) and (newY in rangeY) and (dx, dy) != (0, 0):
adj.append((newX, newY))
return adj
<块引用>
该函数获取 matrix
参数以提取其行和列的大小(我使用 numpy
,因此 matrix.shape
返回 (row_size, column_size)
元组)。
它还获取当前单元格作为 pointer
参数(类似于 (X,Y)
)。
然后它生成相邻的单元格,如果它们是合法的(1.它们没有越界,并且2.与参考位置不相同),它将它们添加到相邻列表中,adj
。
我想强调的是,使用上述算法,您也可以轻松获得更远距离的邻居。只需修改 for 循环中的范围,如下所示:
for v in range(0-distance, 1+distance):
for h in range(0-distance, 1+distance):
...
<块引用>
其中 distance
是您想要进入的最大相邻距离。