You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

符合特定索引递增规则的矩阵列最小值索引求解代码实现求助

如何实现带索引约束的矩阵列最小值索引查找?

需求说明

我需要实现一个功能:为矩阵的每一列找到最小值对应的索引,并且要遵循以下两条规则:

  • 除第一列外,每一列的搜索起始索引为前一列找到的索引+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]

问题分析与修正方案

先梳理下你代码里的几个核心问题:

  1. 变量未定义/逻辑遗漏:代码里用了a但没定义,c只在w==0时赋值,其他情况会直接报错——其实根据规则,不管w是什么,下一列的起始索引都应该是w+1,除非w已经等于总行数。
  2. 终止条件处理不彻底:当currentMinIndex已经等于总行数时,后续列应该直接添加总行数,不需要再执行查找逻辑。
  3. 数据类型兼容问题:示例矩阵里混了字符串类型的数字(比如"-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 19:42:38