例如,我有这个2d数组:
[
[
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的新手!谢谢!
答案 0 :(得分:1)
您可以使用第三方库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]
这些都是矢量化计算。 可以使用列表列表执行这些计算,但这是不可取的。
答案 1 :(得分:0)
@ 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
中创建的子列表中正在进行排序答案 2 :(得分:0)
您可以先按降序对每一行进行排序,然后根据需要选择第一或第二大元素。
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分区方案是两个着名的分区。