python - 如何在矩阵中找到最低 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 循环,如果已经找到最低值,那么“无效”这个并找到第二个最低值,然后同样找到第三个。但我不确定。
请不要太快关闭这个问题 - 我对编程很陌生,而且非常卡住!
解决方案
人性化的方法
我认为我对此的方法与分享的不同答案有很大不同。
我只对每个列表元素进行 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 查询。
推荐阅读
- bash - 使用 bash 在特定列中提取具有特定值的行
- java - 如何构建包含 JAXB/Moxy 适配器的项目
- c# - 弹丸不移动,也不从玩家开始(Unity 2D / C#)
- typescript - 网格数据不显示
- javascript - 默认蜂鸣/叮/警告/警报/嗡嗡声/无声音的 Web API
- angular - 如何在按钮上选择后显示日期
- flutter - Flutter:保存和恢复列表视图的最后滚动位置不起作用
- android - 能够在完成时返回到堆栈上的最后一个活动的验证屏幕,并在后按时完成整个应用程序
- javascript - 没有父级的 JSON 文件如何获取?
- android - Android Facebook loginResult 拒绝电子邮件权限