python - 确定具有周期性条件的二维网格中的相邻单元格

标签 python numpy cell nearest-neighbor

假设我们有以下二维网络,其单元索引我们用整数标记:

20  21  22  23  24
15  16  17  18  19
10  11  12  13  14
5   6   7   8   9
0   1   2   3   4

我想要的是一个函数,它接收单元格索引(单元格)和沿轴的单元格数量(在本例中为 n=5)作为输入,并返回一个包含 9 个邻居的数组(包括单元格本身) ,考虑到全局框的周期性。

我向您展示我尝试过的方法,“几乎”有效:

def celdas_vecinas(cell,n):

    return np.mod(cell + np.array([0, -n-1, -n, -n+1, -1, 1, n-1, n, n+1], dtype=np.int64), n**2)

我输入 np.mod 来反射(reflect)周期性条件。关键是这个函数只对某些值表现良好。

>>> celdas_vecinas(1,5) 
array([ 1, 20, 21, 22,  0,  2,  5,  6,  7]) # right!

>>> celdas_vecinas(21,5)
array([21, 15, 16, 17, 20, 22,  0,  1,  2]) # right!

但是如果我输入角落中的一个单元格的索引,则会发生以下情况:

>>> celdas_vecinas(0,5)
array([ 0, 19, 20, 21, 24,  1,  4,  5,  6]) # should be 9 instead of 19

例如,cell=5 也会失败。

有谁知道如何实现这个功能吗?当单元格索引不触及任何边框时,它很容易实现,但我不知道如何包含周期性影响,尽管我猜它一定与 np.mod 函数有关

最佳答案

行周期不像列周期那样工作。我认为你应该先得到每侧 2 个单元格,然后上下移动。我已经尝试过了,它似乎有效:

def celdas_vecinas(cell, n) :
    last_row = n * (cell // n)
    left_cell = last_row + ( cell - last_row - 1 ) % n
    right_cell = last_row + ( cell - last_row + 1 ) % n
    line = np.array( [ left_cell, cell, right_cell ] )
    return np.mod( [ line + n, line, line - n ], n**2)

(我删除了之前的答案,因为我搞砸了)

关于python - 确定具有周期性条件的二维网格中的相邻单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61643282/

相关文章:

python - SQLObject - 更新多条记录

python - 我怎样才能专注于python中列表的一个子集

c - 删除 C 程序中的条件以加快速度

ios - 单击单元格本身而不是按钮时,(静态)单元格中的按钮消失

python - 限制神经网络回归中的输出总和 (Keras)

python - 使用 Numpy Python 限制矩阵每行中的元素数量

python - 将 python 列表加载为 opencv 图像

python - 为什么这个函数返回全零

c# - 如何将图像添加到 DataGridView 中的单个特定单元格?

带有大文件的 Python 2.5 MemoryError