如何在python中访问矩阵的每个元素的相邻单元格?

时间:2018-08-02 15:18:47

标签: python python-3.x algorithm numpy implementation

如果两个单元格共享边界,则认为它们相邻。 例如:

os.stat

索引为0,0的相邻元素位于索引[0,1]和[1,0],对于索引1,1,相邻元素位于索引[0,1],[1,0],[ 2,1]和[1,2]。

3 个答案:

答案 0 :(得分:1)

假设您有m x n矩阵,并且要查找单元格的相邻索引(ij):

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 是您想要进入的最大相邻距离。

相关问题