【问题标题】:Python qestion about 2d arrays关于二维数组的 Python 问题
【发布时间】:2020-11-20 13:09:19
【问题描述】:

参数应该是二维数组。预期的输出是二维数组中“峰值”的索引值。可以在 main 中进行测试,例如通过运行

 d = [
    [1, 2, 3],
    [4, 5, 6]
  ]
print(find_peak_2d(d))

【问题讨论】:

  • 请添加输入和预期输出,一些代码会很好
  • 参数应该是二维数组。预期的输出是二维数组中“峰值”的索引值。可以在 main 中进行测试,例如运行 d = [ [1, 2, 3], [4, 5, 6] ] print(find_peak_2d(d))

标签: python arrays python-3.x matrix


【解决方案1】:

下面是如何使用 max() 的嵌套列表推导:

d = [[1, 2, 3],
     [4, 5, 6]]

def find_peak_2d(arr):
    result = max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[2])[:-1]
    return result

print(find_peak_2d(d))

输出:

(1, 2)

让我们分解这部分:

max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[1])

首先,让我们只有:

max([max(r) for r in arr])

这将在数组中找到最大的数字,但不是它的索引。 要找到最大数的索引,我们需要使用enumerate 来遍历数组,同时跟踪索引:

max([max([(i, v) for i, v in enumerate(r)]) for r in arr])

如您所见,内部列表推导式现在保留每个数字的索引和值。 但是现在我们需要告诉python如何确定该列表的max,因为我们不希望python简单地找到max索引

为此,我们可以使用带有lambda 函数lambda x: x[1] 的键,因此python 将知道仅比较每个元组的第二个索引以找到max

max([max([(i, v) for i, v in enumerate(r)], key=lambda x:x[1]) for r in arr])

现在我们有了列的索引,是时候找到行的索引了。基本上是一样的,我们用enumerate,还有一个功能为lambda x: x[1]的key:

max([max([(i, v) for i, v in enumerate(w)], key=lambda x:x[1]) for j, w in enumerate(arr)], key=lambda x:x[1])

现在,行的索引将会丢失,因为我们没有在整个迭代过程中将它存储在任何地方。为了解决这个问题, 在此处添加索引:(i, v)(j, i, v)

max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[1]) for j, w in enumerate(arr)], key=lambda x:x[1])

我们现在需要将两个max 的键更改为lambda x:x[2],因为元组的值现在位于第三个索引中。 最后,我们使用[:-1]的切片省略了结果的值:

max([max([(j, i, v) for i, v in enumerate(w)], key=lambda x:x[2]) for j, w in enumerate(arr)], key=lambda x:x[2])[:-1]

【讨论】:

    【解决方案2】:

    按峰值,我假设您的意思是每个数组中的最大值? 此代码返回一维 numpy 数组中最大值的索引。 只需遍历每个数组并跟踪每个 numpy 数组之后最大值的值和索引。 然后简单地返回索引

    result = numpy.where(d == numpy.amax(d))
    

    【讨论】:

      【解决方案3】:

      argmaxunravel_index 一起使用

      import numpy as np
      
      def find_peak(d):
          # if list of lists convert to numpy.array
          if isinstance(d, list):
              d = np.array(d)
          
          ind = np.unravel_index(np.argmax(d, axis=None), d.shape)
          
          return ind
      
      

      这适用于 N 维数组

      d2 = [
          [1, 2, 3],
          [4, 5, 6]
      ]
      d3 = np.array([[0.40380192, 0.83570235, 0.55391089],
             [0.69123726, 0.22616673, 0.69294058],
             [0.20976952, 0.29562301, 0.26660186]])
      
      print(find_peak(d2))
      print(find_peak(d3))
      
      # (1, 2)
      # (0, 1)
      

      【讨论】:

        猜你喜欢
        • 2021-03-03
        • 2020-09-03
        • 2016-05-03
        • 2020-02-11
        • 1970-01-01
        • 2012-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多