我有两个列表,它们有相同数量的元素。每个元素都是一个数字(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或什么的,但我不知道。
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 提供的答案不同,但这似乎不是功能问题,更多的是对需求的理解
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个值的索引,然后索引你的第二个数组:
numpy.argpartition
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])
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]
2条答案
按热度按时间avkwfej41#
我对要求的理解可能不正确。但是,如果没有额外的模块,我会这样做:
输出:
说明:
构建一个2元组列表(值,索引)。自然排序将基于值(元组的第一部分)。使用先前排序列表中的索引构建输出列表。
这里的输出与使用 numpy 提供的答案不同,但这似乎不是功能问题,更多的是对需求的理解
5jvtdoz22#
假设这个例子(为了清楚起见,这里是整数,但这对浮点数同样有效)
你可以用
numpy.argpartition
找到前10个值的索引,然后索引你的第二个数组:如果你想让它们按顺序排列:
更新示例:
纯python方式