numpy 如何找到一个列表中的最大值和另一个列表中的最大值的对应值?

1yjd4xko  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(141)

我有两个列表,它们有相同数量的元素。每个元素都是一个数字(float)。我需要在第一个列表中找到10个最大的值,然后在第二个列表中找到那些与第一个列表中10个最大值的索引相同的值。我该怎么做?(如果可能的话,我想使用numpy)。例如:

a= [0.5, 2.9, 9.7]
b= [1, 3, 5.8]

我需要列表a中最大的两个值,分别是2.9和9.7。它们的索引是1和2,所以我需要列表B中的3和5.8。
我还没有尝试过任何东西,我想amax或什么的,但我不知道。

avkwfej4

avkwfej41#

我对要求的理解可能不正确。但是,如果没有额外的模块,我会这样做:

a = [11, 6, 13, 8, 9, 5, 7, 10, 3, 14, 12, 4, 2, 1, 0]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

a1 = [0.5, 2.9, 9.7]
b1 = [1, 3, 5.8]

def process(a, b, t):
    s = sorted([(v, i) for i, v in enumerate(a)])
    return [b[i] for _, i in s[-t:]]

print(process(a, b, 10))
print(process(a1, b1, 2))

输出:

[5, 1, 6, 3, 4, 7, 0, 10, 2, 9]
[3, 5.8]

说明:

构建一个2元组列表(值,索引)。自然排序将基于值(元组的第一部分)。使用先前排序列表中的索引构建输出列表。
这里的输出与使用 numpy 提供的答案不同,但这似乎不是功能问题,更多的是对需求的理解

5jvtdoz2

5jvtdoz22#

假设这个例子(为了清楚起见,这里是整数,但这对浮点数同样有效)

a1 = np.array([11,  6, 13,  8,  9,  5,  7, 10,  3, 14, 12,  4,  2,  1,  0])
# top 10:       x   x   x   x   x   x   x   x       x   x
a2 = np.array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

你可以用numpy.argpartition找到前10个值的索引,然后索引你的第二个数组:

out = a2[np.argpartition(a1, -10)[-10:]]
# array([ 5,  1,  6,  3,  4,  7, 10,  9,  2,  0])

如果你想让它们按顺序排列:

out = a2[np.sort(np.argpartition(a1, -10)[-10:])]
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  9, 10])
更新示例:
a = np.array([0.5, 2.9, 9.7])
b = np.array([1, 3, 5.8])

out = b[np.sort(np.argpartition(a, -2)[-2:])]
# array([3. , 5.8])
纯python方式
a = [0.5, 2.9, 9.7]
b = [1, 3, 5.8]

N = 2
Nth = sorted(a)[-N]
out = [val_b for val_a, val_b in zip(a, b) if val_a >= Nth]
# [3, 5.8]

相关问题