如何基于条件对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
相关产品推荐
相关产品推荐

