如何获取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.
相关产品推荐
相关产品推荐

