如何在嵌套列表中获取比周围的列表小的值

时间:2019-11-11 16:37:26

标签: python python-3.x

因此,基本上,我必须在嵌套列表中找到与其周围的数字相比最小的数字。这将称为“接收器”,如果它是接收器,则函数返回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

3 个答案:

答案 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+1row+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]]