【问题标题】:How to get a value in a nested list that is smaller than the ones around it如何在嵌套列表中获取小于周围的值的值
【发布时间】:2020-04-03 21:29:05
【问题描述】:

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

【问题讨论】:

标签: python python-3.x


【解决方案1】:

您可以将列表列表转换为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 不引用数组中的最后一个元素;如果上限高于数组的大小,这不是问题。)

注意:如果一个点的邻居具有相同的值,这也会将一个点标识为“汇”;不确定这是否有问题。

【讨论】:

  • 感谢您的帮助,但我们还没有了解到这一点,因此我无法使用它,但无论如何感谢 :)
【解决方案2】:

不知道如何对其进行切片以获取水槽的对角线数字 或高于或低于。

您的问题显示了[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 上不会有任何单元格

【讨论】:

  • 如果rowcol0,那么row-1col-1 部分可能会出错。
  • 非常感谢,我明白了 :)
【解决方案3】:

如果您认为某个值是周围 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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2021-01-15
    • 2015-06-12
    • 2023-03-28
    • 2019-10-14
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多