Предположим, у нас есть следующая двумерная сеть, индексы ячеек которой мы помечаем целыми числами:
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, чтобы отразить условия периода c. Дело в том, что эта функция хорошо себя ведет только для некоторых значений.
>>> 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
Также не работает, например, для ячейки = 5.
Кто-нибудь знает, как я могу реализовать эту функцию? Когда индекс ячейки не касается какой-либо границы, это очень легко реализовать, но я не знаю, как включить эффекты periodi c, хотя я предполагаю, что это должно быть связано с функцией np.mod