【问题标题】:How to find the max of each row in 2d arrays?如何找到二维数组中每一行的最大值?
【发布时间】:2018-09-25 07:43:18
【问题描述】:

例如,我有这个二维数组:

[
    [
     0.0,
     0.24320757858085434,
     0.14893361727523413,
     0.29786723455046826,
     0.18838778030301612,
     0.12160378929042717
    ],
    [
     0.23717478210768014,
     0.0,
     0.16770789675478251,
     0.20539938644228997,
     0.25981195646349819,
     0.1299059782317491
    ],
    [
     0.21681956134183847,
     0.250361664212574,
     0.0,
     0.23178986094050727,
     0.16390018248131957,
     0.13712873102376066
    ],
    [
     0.2933749527592357,
     0.20744741852633861,
     0.15681550844086434,
     0.0,
     0.18554661183269694,
     0.15681550844086434
    ],
    [
     0.20305810393286577,
     0.28716752453162431,
     0.12135042758887897,
     0.20305810393286577,
     0.0,
     0.18536584001376513
    ],
    [
     0.17877693623386351,
     0.19584032147389943,
     0.13848001934394774,
     0.23407395508684939,
     0.25282876786143976,
     0.0
    ]
]

它给出了一组概率。如何找到每一行的最佳概率?还有什么方法可以在不改变元素位置的情况下找到例如第二、第三的最佳概率?

【问题讨论】:

标签: python arrays list python-2.7 numpy


【解决方案1】:

您可以使用第 3 方库 numpy 轻松完成此操作。首先创建一个numpy数组:

A = np.array([[0.0, 0.24320757858085434, 0.14893361727523413, 0.29786723455046826, 0.18838778030301612, 0.12160378929042717], [0.23717478210768014, 0.0, 0.16770789675478251, 0.20539938644228997, 0.25981195646349819, 0.1299059782317491], [0.21681956134183847, 0.250361664212574, 0.0, 0.23178986094050727, 0.16390018248131957, 0.13712873102376066], [0.2933749527592357, 0.20744741852633861, 0.15681550844086434, 0.0, 0.18554661183269694, 0.15681550844086434], [0.20305810393286577, 0.28716752453162431, 0.12135042758887897, 0.20305810393286577, 0.0, 0.18536584001376513], [0.17877693623386351, 0.19584032147389943, 0.13848001934394774, 0.23407395508684939, 0.25282876786143976, 0.0]])

返回每行的最大值:

res = A.max(axis=1)

对于每行中的第二大,您可以使用numpy.sort。这会沿着一个轴(不在位)排序,然后提取第二大的(通过 -2)。

res = np.sort(A, axis=1)[:, -2]

这些都是矢量化计算。您可以使用列表列表执行这些计算,但这是不可取的。

【讨论】:

  • 谢谢!您建议使用什么来代替列表?元组?
  • numpy 数组,我在第一行代码中展示了如何将列表列表转换为 numpy 数组。在这种格式下,您可以方便地以向量化的方式执行基于数组的计算。
  • link 你能明白为什么例如在第一行它给了我第三而不是第二吗?
【解决方案2】:

@jpp 的 numpy 解决方案可能是要走的路,因为他们给出的原因,但如果你想从纯 python 中做到这一点,你可以执行以下操作:

#Get the maximum value for each list

[[max(i)] for i in my_list]

# [[0.29786723455046826], [0.2598119564634982], [0.250361664212574], 
# [0.2933749527592357], [0.2871675245316243], [0.25282876786143976]]

# Get the maximum 2 values for each list:

[sorted(i)[-2:] for i in my_list]

# Get the maximum 3 values for each list:

[sorted(i)[-3:] for i in my_list]

等等。请注意,这不会重新排序原始列表,因为排序发生在 list comprehension 中创建的子列表中

【讨论】:

    【解决方案3】:

    您可以先对每一行进行降序排序,然后根据需要选择第一大或第二大的元素。

    a = [
        [
         0.0,
         0.24320757858085434,
         0.14893361727523413,
         0.29786723455046826,
         0.18838778030301612,
         0.12160378929042717
        ],
        [
         0.23717478210768014,
         0.0,
         0.16770789675478251,
         0.20539938644228997,
         0.25981195646349819,
         0.1299059782317491
        ],
        [
         0.21681956134183847,
         0.250361664212574,
         0.0,
         0.23178986094050727,
         0.16390018248131957,
         0.13712873102376066
        ]
    ]
    
    for i in range(0, len(a)):
        a[i].sort(reverse=True)
    
    print "1st Largests:"
    for row in a:
        print "\t" + str(row[0])
    
    print "2nd Largests:"
    for row in a:
        print "\t" + str(row[1])
    

    PS:如果您担心效率,那么您需要寻找的是分区。 Lomuto 和 Hoare 分区方案是两个著名的分区方案。

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 2016-03-16
      • 1970-01-01
      • 2022-11-01
      • 2021-02-18
      • 2016-03-19
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      相关资源
      最近更新 更多