基于Numpy实现二值矩阵右下角子矩阵含1时对应位置标1功能
问题描述
给定仅包含0和1的n*n矩阵M,需要构造新矩阵:当且仅当原矩阵的右下角子矩阵M[i:n, j:n]中至少存在一个1时,新矩阵的(i,j)位置取值为1。要求完全基于Numpy实现,所有运算走Numpy编译执行逻辑,保障性能。
输入输出示例
输入矩阵:
0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0
期望输出矩阵:
0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1
实现思路
要避免Python层循环、全走Numpy向量化运算,可以通过两次反向累积或操作实现:
- 先对矩阵从下到上沿列方向做逻辑或累积:此时每个位置的值代表当前位置及下方所有行同列位置是否存在1
- 再对第一步的结果从右到左沿行方向做逻辑或累积:此时每个位置的值就代表当前位置及右下角所有子矩阵区域是否存在1
代码实现
import numpy as np def compute_right_bottom_ones(mat: np.ndarray) -> np.ndarray: # 输入校验:仅接受2维矩阵 if mat.ndim != 2: raise ValueError("输入必须为2维矩阵") # 第一步:从下到上沿列做累积或 col_accum = np.logical_or.accumulate(mat[::-1, :], axis=0)[::-1, :] # 第二步:从右到左沿行做累积或 row_accum = np.logical_or.accumulate(col_accum[:, ::-1], axis=1)[:, ::-1] # 输出转为和输入同类型的0/1矩阵 return row_accum.astype(mat.dtype)
示例验证
# 构造示例输入 input_mat = np.array([ [0,0,0,0,1], [0,0,1,0,0], [0,0,0,0,1], [1,0,1,0,0] ]) # 计算输出 output_mat = compute_right_bottom_ones(input_mat) print(output_mat)
运行后输出和期望结果完全一致。
内容的提问来源于stack exchange,提问作者Vincent Hachin
相关产品推荐
相关产品推荐

