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

如何基于条件对Numpy矩阵/掩码进行前向填充(Forward fill)

如何基于条件对Numpy矩阵/掩码进行前向填充(Forward fill)

嘿,这个需求我之前也碰到过,用Numpy的向量操作就能高效搞定,不用傻乎乎地逐行循环~ 先看看你的原始矩阵:

import numpy as np

A = np.array([
    [0, 0, 0, 0, 1, 0, 1],
    [0, 0, 0, 0, 0, 0, 1],
    [1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0]
]).astype(bool)

你的目标是:每行里只要出现第一个True,它右侧(列方向)的所有元素都要变成True,对吧?这里有个简洁的实现方式:

# 获取每行第一个True的索引,没有True的行暂时会返回0(后面修正)
first_true_idx = np.argmax(A, axis=1)
# 修正全False的行:把它们的索引设为矩阵的列数,这样后续不会触发填充
first_true_idx[~A.any(axis=1)] = A.shape[1]

# 生成列索引矩阵,和每行的第一个True位置做广播比较
col_indices = np.arange(A.shape[1])
result = col_indices >= first_true_idx[:, np.newaxis]

运行这段代码后,result就是你想要的布尔掩码;如果需要和你示例一致的整数形式输出,只需要转成int类型:

# 布尔形式结果
print(result)
# 整数形式结果(匹配你的期望输出)
print(result.astype(int))

整数形式的输出如下:

[[0 0 0 0 1 1 1]
 [0 0 0 0 0 0 1]
 [1 1 1 1 1 1 1]
 [0 0 0 0 0 0 0]]

我来拆解下逻辑:

  • np.argmax(A, axis=1)会返回每行中第一个True的索引(因为True等价于1,False是0,argmax会找第一个最大值的位置),但全False的行默认返回0,这不符合我们的需求,所以用~A.any(axis=1)定位这些行,把它们的索引改成矩阵的列数,这样后续比较时列索引永远不会大于等于它,保持全False。
  • col_indices = np.arange(A.shape[1])生成从0到列数-1的数组,再通过first_true_idx[:, np.newaxis]把一维索引转成二维列向量,利用Numpy的广播特性,就能快速生成每行中「列索引≥第一个True位置」的掩码。

如果想直接修改原矩阵,直接赋值就行:A[:] = result。

备注:内容来源于stack exchange,提问作者HJA24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:53:00