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

Python如何实现按行随机将矩阵指定百分比的行置零或mask

随机行置零实现方案

下面提供两种常用的实现方式,按需选择即可:

纯Python原生实现(无第三方依赖)

核心逻辑是先计算需要置零的行数,随机选出行索引后对应置零,适合小矩阵、不想额外装依赖的场景:

import random

def random_mask_rows(arr, mask_ratio):
    row_total = len(arr)
    # 计算待置零行数,默认向下取整,可根据需求换用round、math.ceil等取整逻辑
    mask_count = int(row_total * mask_ratio)
    # 随机选出不重复的待置零行索引
    mask_indexes = random.sample(range(row_total), k=mask_count)
    # 对应行全部置零
    for idx in mask_indexes:
        arr[idx] = [0] * len(arr[idx])
    return arr

# 测试用例
if __name__ == "__main__":
    arr = [[1,1,1,1],
           [2,2,2,2],
           [3,3,3,3],
           [4,4,4,4],
           [5,5,5,5]]
    print(random_mask_rows(arr, 0.4))

Numpy实现(高效适合大矩阵)

如果你的项目已经用到Numpy,用向量化操作处理会比原生循环高效很多,尤其适合行数过万的大矩阵场景:

import numpy as np

def random_mask_rows_np(arr, mask_ratio):
    arr_np = np.asarray(arr)
    row_total = arr_np.shape[0]
    mask_count = int(row_total * mask_ratio)
    # 随机选不重复的行索引
    mask_indexes = np.random.choice(row_total, mask_count, replace=False)
    # 直接批量赋值置零,无需循环
    arr_np[mask_indexes] = 0
    # 不需要转原生列表可以删掉下面这行,直接返回arr_np
    return arr_np.tolist()

# 测试用例
if __name__ == "__main__":
    arr = [[1,1,1,1],
           [2,2,2,2],
           [3,3,3,3],
           [4,4,4,4],
           [5,5,5,5]]
    print(random_mask_rows_np(arr, 0.4))

补充说明

  • 如果不想修改原始数组,可以先做深拷贝再操作:原生Python用copy.deepcopy(arr),Numpy用arr_np.copy()即可。
  • 取整逻辑可以根据需求调整:比如需要四舍五入算行数就把int()换成round(),需要向上取整就导入math模块用math.ceil()。

内容的提问来源于stack exchange,提问作者NeuralNew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:06