因此,基本上,我必须在嵌套列表中找到与其周围的数字相比最小的数字。这将称为“接收器”,如果它是接收器,则函数返回True,否则返回False。例如,如果嵌套列表是
[[1, 2, 1],
[4, 6, 5],
[7, 8, 9]]
然后,[0,2](1)处的数字应为true,因为与其相邻的所有值均小于1,但[2,0](7)处的数字不应为true因为它大于周围的一些值。
我试图使用切片来获取旁边的数字,但是我不知道如何切片以从水槽或上方或下方得到对角线的数字。 这是我尝试执行的一些代码:
for x in elevation_map:
for xs in x:
if elevation_map[cell[0]][cell[1]] < xs[cell[0]]:
return True
return False
答案 0 :(得分:1)
您可以将列表列表转换为numpy
数组,迭代索引,并使用二维切片获得子矩阵,并检查当前位置的值是否为最小值。 / p>
>>> 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
不会引用数组中的最后一个元素;如果上限大于数组的大小,那不是问题。 )
注意:如果一个邻居的一个点具有相同的值,这还将把一个点识别为“汇”;不知道这是否有问题。
答案 1 :(得分:0)
不知道如何切片以从水槽中获取对角线数字 或以上或以下。
您的问题显示了[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]
在计算索引时,您将需要包括检查以查看您是否处于 2-d 结构的边缘。如果您位于左边缘,则col-1
将绕到该行中的最后一项;如果您位于顶部边缘,则row-1
将绕至该列中的最后一项。您可能还需要检查右边缘和下边缘-col+1
或row+1
上没有任何单元格。
答案 2 :(得分:0)
如果您认为某个值是接收器(如果它是周围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]]