【问题标题】:Understanding argmax了解 argmax
【发布时间】:2016-07-17 22:55:11
【问题描述】:

假设我有矩阵

import numpy as np    
A = np.matrix([[1,2,3,33],[4,5,6,66],[7,8,9,99]])

我正在尝试理解函数 argmax,据我所知它返回最大值

如果我在 Python 上尝试过:

np.argmax(A[1:,2])

我是否应该在第二行中获取最大元素,直到行尾(即第三行)并沿第三列?所以应该是数组[6 9],arg max 应该返回9?但是为什么当我在 Python 上运行它时,它会返回值 1?

如果我想返回第 3 列中从第 2 行开始的最大元素(即 9),我应该如何修改代码?

我已经检查了 Python 文档,但仍然有点不清楚。感谢您的帮助和解释。

【问题讨论】:

标签: python


【解决方案1】:

argmax 返回最大值的位置max 返回最大值。

import numpy as np    
A = np.matrix([[1,2,3,33],[4,5,6,66],[7,8,9,99]])

np.argmax(A)  # 11, which is the position of 99

np.argmax(A[:,:])  # 11, which is the position of 99

np.argmax(A[:1])  # 3, which is the position of 33

np.argmax(A[:,2])  # 2, which is the position of 9

np.argmax(A[1:,2])  # 1, which is the position of 9

【讨论】:

  • 是的。 OP可以看到stackoverflow.com/questions/3584243/…
  • 我试过 np.argmax(A),但它返回 10 而不是 11?
  • 原始海报的缩写,在这种情况下为@user71346。
  • @OP:它应该是 11,因为数组是从零开始的,而 99 是 12 中的最大值和最后一个值。
  • A 是搜索所有,A[:,2] 搜索所有行和第三列,A[1:,2] 是搜索所有大于初始行和第三列的行
【解决方案2】:

argmax 是一个函数,它给出给定行或列中最大数字的索引,并且可以使用argmax 函数的轴属性来确定行或列。如果我们给出axis=0,那么它将给出列的索引,如果我们给出axis=1,那么它将给出行的索引。

在您给定的示例A[1:, 2] 中,它将首先从病房的第一行获取值,并从这些行中获取唯一的第二列值,然后从结果矩阵中找到最大值的索引。

【讨论】:

    【解决方案3】:

    我花了一段时间才弄清楚这个功能。基本上 argmax 会返回数组中最大值的 index。现在数组可以是一维或多维的。以下是一些示例。

    一维

    a = [[1,2,3,4,5]]
    np.argmax(a)
    >>4
    

    数组是一维的,所以函数只返回数组中最大值(5)的索引,即4。

    多维度

    a = [[1,2,3],[4,5,6]]
    np.argmax(a)
    >>5
    

    在此示例中,数组是二维的,形状为 (2,3)。由于函数中没有指定axis参数,所以numpy库将数组展平为一维数组,然后返回最大值的索引。在这种情况下,数组被转换为 [[1,2,3,4,5,6]] 然后返回 6 的索引,即 5。

    当参数为axis = 0时

    a = [[1,2,3],[4,5,6]]
    np.argmax(a, axis=0)
    >>array([1, 1, 1])
    

    这里的结果起初让我有点困惑。由于轴被定义为 0,因此该函数现在将尝试沿着矩阵的行找到最大值。最大值 6 位于矩阵的第二行。第二行的索引为1。根据documentation,将删除axis参数中指定的维度。由于原始矩阵的形状为 (2,3) 且轴指定为 0,因此返回的矩阵将具有 (3,) 的形状,因为原始形状 (2,3) 中的 2 已被删除。该行现在重复找到最大值的元素的数量与原始矩阵中的列数相同,即 3。

    当参数为axis = 1时

    a = [[1,2,3],[4,5,6]]
    np.argmax(a, axis=1)
    >>array([2, 2])
    

    与上面相同的概念,但现在返回列的索引,最大值是可用的。在此示例中,最大值 6 位于第 3 列,索引 2。形状为 (2,3) 的原始矩阵的列将被删除,转换为 (2,),因此返回数组将显示两个元素,每个元素显示找到最大值的列的索引。

    【讨论】:

    • axis=0,类似[0, 2, 1]的响应意味着对于第一列,第0个元素最高,对于第二列,第2个(0索引)元素最高,对于第三列,第一个元素是最高的。希望对喜欢它的人有所帮助。
    【解决方案4】:

    在我使用 python 的第一步中,我已经测试了这个函数。这个例子的结果让我明白了 argmax 的工作原理。

    示例

    # Generating 2D array for input 
    array = np.arange(20).reshape(4, 5) 
    array[1][2] = 25
    
    print("The input array: \n", array) 
    
    # without axis
    print("\nThe max element: ", np.argmax(array))
    # with axis
    print("\nThe indices of max element: ", np.argmax(array, axis=0)) 
    print("\nThe indices of max element: ", np.argmax(array, axis=1)) 
    

    结果示例

    The input array: 
    [[ 0  1  2  3  4]
    [ 5  6 25  8  9]
    [10 11 12 13 14]
    [15 16 17 18 19]]
    
    The max element:  7
    
    The indices of max element:  [3 3 1 3 3]
    
    The indices of max element:  [4 2 4 4]
    

    在该结果中,我们可以看到 3 个结果。

    1. 所有数组中的最高元素位于位置 7。
    2. 每列中的最高元素位于索引为 3 的最后一行,除了第三列,最高值位于索引为 1 的第二行中。
    3. 每行中的最高元素位于索引为 4 的最后一列中,但第二行的最高值位于索引为 2 的第三列中除外。

    参考:https://www.crazygeeks.org/numpy-argmax-in-python/

    希望对你有帮助。

    【讨论】:

      【解决方案5】:

      下面是 argmax 的工作原理。假设我们给了数组

      matrix = np.array([[1,2,3],[4,5,6],[7,8,9], [9, 9, 9]])
      

      现在,从给定数组中找出最大值

      np.max(matrix)
      

      答案将是 -> 9

      现在找到给定数组的argmax

      np.argmax(matrix)
      

      答案将是 -> 8

      它是如何得到 8 的,让我们了解一下

      python 会将数组转换为一维,所以数组看起来像

      array([1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9])
      Index  0  1  2  3  4  5  6  7  8  9 10 11
      

      所以最大值是99 的第一次出现在索引8。这就是为什么argmax 的答案是8

      • 轴 = 0(按列最大)

      现在,逐列查找最大值

      np.argmax(matrix, axis=0)
      
      Index   0  1  2
        0    [1, 2, 3]
        1    [4, 5, 6]
        2    [7, 8, 9]
        3    [9, 9, 9]
      
      • 第一列的值为1 4 7 9,第一列的最大值为9,位于索引3
      • 第二列相同,值为2 5 8 9,第二列最大值为9,位于索引3
      • 第三列的值为3 6 9 9,最大值为9,位于索引23,因此9的第一次出现位于索引2

      所以输出会像[3, 3, 2]

      • 轴 = 1(按行)

      现在逐行查找最大值

      np.argmax(matrix, axis=1)
      
          Index   0  1  2
            0    [1, 2, 3]
            1    [4, 5, 6]
            2    [7, 8, 9]
            3    [9, 9, 9]
      
      • 第一行值为1 2 3,最大值为3,位于索引2
      • 第二行值为4 5 6,最大值为6,位于索引2
      • 第三行的值为7 8 9,最大值为9,位于索引2
      • 第四行的值为9 9 9,最大值为9,位于索引0 1 2,但9的第一次出现位于索引0

      所以输出会像[2 2 2 0]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2022-01-10
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多