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
相关产品推荐
相关产品推荐

