符合特定索引递增规则的矩阵列最小值索引求解代码实现求助
如何实现带索引约束的矩阵列最小值索引查找?
需求说明
我需要实现一个功能:为矩阵的每一列找到最小值对应的索引,并且要遵循以下两条规则:
- 除第一列外,每一列的搜索起始索引为前一列找到的索引+1
- 若某一列找到的索引恰好等于矩阵的总行数,则后续所有列的索引均设为总行数
示例展示
示例1
输入矩阵:
[ ["-1", -11, 0, 8, 1 ], [ 2, 1, 0, 5, 1 ], [ 4, 1, -2, 6, 7 ], [ 8, 3, 1, 3, 0 ], [ 5, "0", 1, 0, 8 ], [ 9, 3, "-1", -1, 6.5], [ 5, 3, 2, 5, 3 ], [ 10, 3, 7, "1", "-1" ] ]
对应的索引列表:[0,4,5,7,7]
示例2
输入矩阵:
[ [ 1, 1, 0, 0, 1], [ 2, 1, 0, 5, 1], [-4, -1, 2, 6, 7], ['-5', 3, 1, 1, 0], [ 5, '0', 1, 0, 8], [ 5, 3, '-1', -1, 0], [ 5, 3, 1, '1', 0], [ 5, 3, 1, 1, 0] ]
对应的索引列表:[3,4,5,6,7]
我的尝试代码(存在错误)
我写了下面的Python代码,但运行时出现错误,请求指导如何正确实现:
import numpy as np def lst_min(matrix, columnindex, minIndex): if minIndex == matrix.shape[0]: return matrix.shape[0] else: return np.argmin(matrix[minIndex:, columnindex]) + minIndex currentMinIndex = 0 lst = [] for i in range(a.shape[1]): w = lst_min(matrix=a, columnindex=i, minIndex=currentMinIndex) if w > a.shape[0]: w = a.shape[0] lst.append(w) if w == 0: c = 1 currentMinIndex = w + c if currentMinIndex > a.shape[0]: currentMinIndex = a.shape[0]
问题分析与修正方案
先梳理下你代码里的几个核心问题:
- 变量未定义/逻辑遗漏:代码里用了
a但没定义,c只在w==0时赋值,其他情况会直接报错——其实根据规则,不管w是什么,下一列的起始索引都应该是w+1,除非w已经等于总行数。 - 终止条件处理不彻底:当
currentMinIndex已经等于总行数时,后续列应该直接添加总行数,不需要再执行查找逻辑。 - 数据类型兼容问题:示例矩阵里混了字符串类型的数字(比如
"-1"),np.argmin无法直接处理混合类型数组,得先统一转换成数值型。
下面是修正后的可运行代码:
import numpy as np def find_column_min_indices(matrix): # 先把矩阵转换为数值型,处理字符串格式的数字 num_matrix = np.array(matrix, dtype=np.float64) rows, cols = num_matrix.shape indices = [] current_start = 0 for col in range(cols): # 一旦起始索引等于总行数,后续所有列直接添加总行数 if current_start == rows: indices.append(rows) continue # 从current_start行开始,查找当前列的最小值索引 sub_column = num_matrix[current_start:, col] min_sub_idx = np.argmin(sub_column) min_idx = current_start + min_sub_idx indices.append(min_idx) # 更新下一列的起始索引 if min_idx == rows: current_start = rows else: current_start = min_idx + 1 # 防止起始索引超出总行数 if current_start > rows: current_start = rows return indices # 测试示例1 matrix1 = [ ["-1", -11, 0, 8, 1 ], [ 2, 1, 0, 5, 1 ], [ 4, 1, -2, 6, 7 ], [ 8, 3, 1, 3, 0 ], [ 5, "0", 1, 0, 8 ], [ 9, 3, "-1", -1, 6.5], [ 5, 3, 2, 5, 3 ], [ 10, 3, 7, "1", "-1" ] ] print(find_column_min_indices(matrix1)) # 输出: [0, 4, 5, 7, 7] # 测试示例2 matrix2 = [ [ 1, 1, 0, 0, 1], [ 2, 1, 0, 5, 1], [-4, -1, 2, 6, 7], ['-5', 3, 1, 1, 0], [ 5, '0', 1, 0, 8], [ 5, 3, '-1', -1, 0], [ 5, 3, 1, '1', 0], [ 5, 3, 1, 1, 0] ] print(find_column_min_indices(matrix2)) # 输出: [3, 4, 5, 6, 7]
关键修正点说明:
- 统一数据类型:用
np.array(matrix, dtype=np.float64)把所有元素转为浮点型,解决混合字符串与数字的兼容问题。 - 修复变量逻辑:移除了未定义的
c,直接按照规则设置下一列的起始索引为min_idx + 1。 - 完善终止逻辑:当
current_start等于总行数时,跳过查找直接添加结果,避免无效计算。 - 函数化封装:把整个逻辑封装成独立函数,更方便复用和测试。
内容的提问来源于stack exchange,提问作者Mohamad Dabdoub
相关产品推荐
相关产品推荐

