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

numpy数组逐列取最大值行索引且每行仅选一次的高效实现方案

逐列查找唯一行索引最大值的高效Numpy实现

核心思路

你的原始逻辑是按列顺序贪心选择当前列的最大值行,且每个行索引仅能使用一次。我们可以通过Numpy的向量化操作完全替换掉内层的Python行循环,大幅提升执行效率:

  • 复制原矩阵避免修改输入数据
  • 逐列查找当前列的最大值对应的行索引
  • 把已经选中的行所有元素置为-np.inf,后续列查找最大值时会自动跳过这些行

实现代码

import numpy as np

def greedy_argmax_unique(matrix):
    # 复制矩阵避免修改原始输入
    mat = matrix.copy()
    n_rows, n_cols = mat.shape
    result = np.empty(n_cols, dtype=np.int32)
    for col_idx in range(n_cols):
        # 向量化查找当前列最大值的行索引
        max_row = np.argmax(mat[:, col_idx])
        result[col_idx] = max_row
        # 标记该行已使用,后续不会再被选中
        mat[max_row, :] = -np.inf
    return result.tolist()

测试验证

用你给出的示例测试,输出和预期一致:

A = np.array([[1, 1], [2, 2]])
print(greedy_argmax_unique(A)) # 输出 [1, 0]

性能说明

原双层Python循环的时间复杂度虽然也是O(N*M),但所有循环逻辑都在Python解释器层执行,超大矩阵下性能极差。优化后的实现仅保留了列维度的Python循环,单次列最大值查找和行赋值都是Numpy底层C实现,同等数据规模下性能通常可以提升10~100倍。

补充:全局最优方案(可选)

如果你需要的不是按列优先的贪心结果,而是全局最优的「每行仅选一次、所有列选中值的总和最大」的匹配结果,可以使用scipy的线性分配算法实现:

from scipy.optimize import linear_sum_assignment
import numpy as np

def global_optimal_argmax(matrix):
    # 线性和分配默认求最小值,取负转为求最大值匹配
    row_ids, col_ids = linear_sum_assignment(-matrix)
    # 按列顺序整理结果
    return row_ids[np.argsort(col_ids)].tolist()

注意该方案结果和你原始的贪心逻辑结果可能不同,仅在需要全局最优时使用。

内容的提问来源于stack exchange,提问作者mommomonthewind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:27:04