所以基本上我必须在嵌套列表中找到与其周围的数字相比的最小数字。这将被称为"接收器",如果它是接收器,则该函数返回 True,如果不是接收器,则返回 False。例如,如果嵌套列表是
[[1, 2, 1],
[4, 6, 5],
[7, 8, 9]]
那么 [0,2], (1) 处的数字应该是真的,因为它旁边的所有值都小于 1,但 [2, 0], (7) 处的数字不应该为真,因为它大于它周围的一些值。
我尝试使用切片来获取它旁边的数字,但我不知道如何切片以从水槽或上方或下方获取对角线的数字。 这是我尝试执行的一些代码:
for x in elevation_map:
for xs in x:
if elevation_map[cell[0]][cell[1]] < xs[cell[0]]:
return True
return False
您可以将列表列表转换为numpy
数组,迭代索引,并使用二维切片来获取子矩阵并检查当前位置的值是否为最小值。
>>> import numpy as np
>>> from itertools import product
>>> m = np.array([[1, 2, 1],
... [4, 6, 5],
... [7, 8, 9]])
...
>>> [(r, c, m[r,c]) for r,c in product(*map(range, m.shape))
... if m[r,c] == m[max(0,r-1):r+2,max(0,c-1):c+2].min()]
...
[(0, 0, 1), (0, 2, 1)]
(max(0, ...)
是这样下限0-1
不引用数组中的最后一个元素;如果上限高于数组的大小,则不是问题。
注意:如果一个点的相邻点具有相同的值,这也会将该点标识为"接收器";不确定这是否是一个问题。
如何切片以从水槽中获取对角线的数字 或高于或低于。
您的问题显示了[row,col]
的索引方案。
对角线:
[row-1,col-1], [row-1,col+1], [row+1,col-1], [row+1,col+1]
左、右、上:
[row,col-1],[row,col+1],[row-1,col],[row+1,col]
[row-1,col-1]
[row-1, col ]
[row-1,col+1]
[ row ,col-1]
[ row , col ]
[ row ,col+1]
[row+1,col-1]
[row+1, col ]
[row+1,col+1]
在计算指数时,您需要包括检查以查看您是否处于二维结构的边缘。如果你在左边缘,那么col-1
会说唱到该行中的最后一项,如果你在上边缘,那么row-1
会说唱到该列中的最后一项。您可能还想检查右边缘和下边缘 -col+1
或row+1
处不会有任何单元格。
如果某个值是周围 3x3 网格的最小值,则将其视为接收器,即您不要求它严格小于它周围的任何其他值,那么您可以使用numpy.lib.stride_tricks.as_strided
来创建检查 3x3 邻居的窗口。为了在矩阵的边缘工作,可以使用np.inf
填充原始数组(因为稍后使用min
):
import numpy as np
matrix = np.array(
[[1, 2, 1],
[4, 6, 5],
[7, 8, 9]])
padded = np.pad(matrix.astype(float), 1, constant_values=np.inf)
window = np.lib.stride_tricks.as_strided(
padded,
padded.shape + (3, 3),
padded.strides * 2)[:-2, :-2]
result = matrix == window.min(axis=(-2, -1))
这给出了以下结果:
[[ True False True]
[False False False]
[False False False]]