python - 确定具有周期性条件的二维网格中的相邻单元格
问题描述
假设我们有以下二维网络,我们用整数标记其单元格索引:
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 以反映周期性条件的位置。关键是这个函数只对某些值表现良好。
>>> 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)
(我删除了我之前的答案,因为我搞砸了)
推荐阅读
- javascript - 从ajax存储变量
- javascript - 如何过滤字符串数组以检测有效 URL?
- python - 返回 Python 中的封闭范围变量
- amazon-web-services - 触发退回事件时,Amazon SNS 不发送通知
- java - 在Java中转换数组过程?(协方差和 [LObject)
- python - 为 python 目录中的每个模块调用特定函数
- boolean-logic - 为什么布尔逻辑语句需要采用联合范式 (CNF)
- kubernetes - 了解 Kubernetes Api Server 如何对 kubectl 管理请求进行身份验证
- javascript - 如何在 ionic V1 中使用 searchBar
- azure - Upsert 仅更改/新字段?