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

如何获取numpy矩阵中每列首个True值的行索引?

问题:找到NumPy矩阵每列首个True的行索引

我定义了如下NumPy布尔矩阵:

import numpy as np
d = np.array(
      [[False, False, False, False, False,  True],
       [False, False, False, False, False,  True],
       [False, False, False, False,  True,  True],
       [False, False, False, False,  True,  True],
       [False, False, False,  True,  True,  True],
       [False, False, False,  True,  True,  True],
       [False, False,  True,  True,  True,  True],
       [False, False,  True,  True,  True,  True],
       [False,  True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True,  True],
       [False, False,  True,  True,  True,  True],
       [False, False, False,  True,  True,  True],
       [False, False, False, False,  True,  True],
       [False, False, False, False, False,  True],
       [False, False, False, False,  True,  True],
       [False, False, False,  True,  True,  True],
       [False, False,  True,  True,  True,  True],
       [False,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True]])

需要生成一个长度为6的向量,每个元素对应矩阵各列中首个True值所在的行索引,预期输出为:

fo = np.array([10, 8, 6, 4, 2, 0])

如果某列没有True值,对应位置返回NaN。

我曾尝试用np.sum(d, axis=0)得到array([4, 8, 12, 16, 20, 23]),结合列长度计算索引,但这个方法只适用于False和True各自连续的情况,无法处理矩阵中True不连续的场景。


解决方案

通用实现方法

利用np.argmax的特性结合np.where处理无True的列,代码如下:

# 获取每列首个True的索引,无True则返回NaN
first_true_indices = np.where(d.any(axis=0), np.argmax(d, axis=0), np.nan)

代码说明:

  • d.any(axis=0):检查每列是否存在True,返回一个布尔数组,标记哪些列有True值
  • np.argmax(d, axis=0):对每列取第一个True的索引(布尔矩阵中True被视为1,False为0,argmax会返回第一个最大值的位置,也就是首个True的索引)
  • np.where:将无True的列对应的索引替换为NaN

针对给定的矩阵d,运行上述代码后会得到array([10., 8., 6., 4., 2., 0.]),完全符合预期。

可选调整:整数类型结果

如果需要用整数标记无True的列(比如用-1代替NaN),可以修改为:

first_true_indices = np.where(d.any(axis=0), np.argmax(d, axis=0), -1)

内容的提问来源于stack exchange,提问作者M.E.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:06:27