首页 > 解决方案 > 如何在矩阵中找到最低 3 个值

问题描述

所以我有这个功能来找到矩阵中的最小值,并返回它在矩阵中的位置,即它的索引:

final_matrix=[[3.57 2.71 9.2 5.63]
              [4.42 1.4 3.53 8.97]
              [1.2 0.33 6.26 7.77]
              [6.36 3.6 8.91 7.42]
              [1.59 0.9 2.4 4.24]] # this changes in my code, im just giving a very simple version of it here

def lowest_values(final_matrix):
best_value=10000 #or any arbitrarily high number 
    for i in range(0,len(final_matrix[:,0])):
        for j in range(0,len(final_matrix[0,:])):
            if final_matrix[i,j]<best_value:
                best_value=final_matrix[i,j]
                lowest_val_i=i
                lowest_val_j=j
    return(lowest_val_i, lowest_val_j)

这返回了我(1,2),仅通过视觉分析是正确的。我现在想找到最低的 3 个值 - 希望能够构建到这个循环中。但我真的想不出怎么办!或者至少我不知道如何实现它。我在想一些 if-else 循环,如果已经找到最低值,那么“无效”这个并找到第二个最低值,然后同样找到第三个。但我不确定。

请不要太快关闭这个问题 - 我对编程很陌生,而且非常卡住!

标签: pythonfor-loopif-statementminimum

解决方案


人性化的方法

我认为我对此的方法与分享的不同答案有很大不同。

我只对每个列表元素进行 3 次比较,所以它应该是 O(n)。此外,我没有创建一个包含所有元素的 (value, indices) 元组的全新列表。

matrix=[[3.57, 2.71, 9.2, 5.63],
              [4.42, 1.4, 3.53, 8.97],
              [1.2, 0.33, 6.26, 7.77],
              [6.36, 3.6, 8.91, 7.42],
              [1.59, 0.9, 2.4, 4.24]]
              
            
def compare_least_values(value, i, j):
    global least
    if value < least[2][0] :
        if value < least[1][0] :
            if value < least[0][0] :
                least.insert(0, (value,(i,j)))
            else:
                least.insert(1, (value,(i,j)))
        else:
            least.insert(2, (value,(i,j)))
    

def lowest_three_values(matrix): 
    global least
    least = [(10000, (None, None)), (10000, (None, None)), (10000, (None, None))]  
    for i, row in enumerate(matrix):
        for j, value in enumerate(row):
            compare_least_values(value, i, j)
    return least[:3]
    
print(lowest_three_values(matrix))

输出:

[(0.33, (2, 1)), (0.9, (4, 1)), (1.2, (2, 0))]

实用方法(Numpy)

如果您熟悉 numpy,那么这就是您要走的路。即使您不是,它也可以用作复制粘贴片段。

import numpy as np

matrix=[[3.57, 2.71, 9.2, 5.63],
              [4.42, 1.4, 3.53, 8.97],
              [1.2, 0.33, 6.26, 7.77],
              [6.36, 3.6, 8.91, 7.42],
              [1.59, 0.9, 2.4, 4.24]]
matrix = np.array(matrix)

indices_1d = np.argpartition(matrix, 3, axis=None)[:3]
indices_2d = np.unravel_index(indices_1d, matrix.shape)
least_three = matrix[indices_2d]

print('least three values : ', least_three)
print('indices : ', *zip(*indices_2d) )

输出:

least three values :  [0.33 0.9  1.2 ] 
indices :  (2, 1) (4, 1) (2, 0)

有关此问题的详细答案,请参阅此Stackoverflow 查询


推荐阅读