如何实现100个(8,8,8)二值数组确定性赋值:每阵固定40%元素为0
确定占比的二值数组生成方案
首先明确计算前提:单个(8,8,8)子数组的总元素数为8*8*8=512,40%占比对应的0的数量为512*0.4=204.8,不是整数,我们取四舍五入后的205个0(对应占比约40.04%,误差可忽略),剩余307个为1。如果你需要完全无比例误差,需要调整数组总元素数为5的倍数。
实现代码
import numpy as np num1 = 100 elem_per_sub = 8 ** 3 n_zero = int(np.round(elem_per_sub * 0.4)) n_one = elem_per_sub - n_zero # 生成基础数组:每个子数组的元素平铺后前n_zero位为0,剩余为1 base_arr = np.repeat([[0] * n_zero + [1] * n_one], num1, axis=0) # 对每个子数组的元素做随机打乱 rng = np.random.default_rng() shuffled_arr = rng.permuted(base_arr, axis=1) # 调整为目标形状 P = shuffled_arr.reshape(num1, 8, 8, 8)
兼容方案(numpy版本低于1.20无permuted方法)
将打乱步骤替换为以下代码即可:
shuffled_arr = np.apply_along_axis(np.random.permutation, 1, base_arr)
结果验证
可以通过以下代码确认所有子数组的0数量符合要求:
# 统计每个子数组的0元素个数 zero_cnt = (P == 0).sum(axis=(1,2,3)) print(np.unique(zero_cnt)) # 输出应为[205],代表所有子数组的0数量都符合预设值
内容的提问来源于stack exchange,提问作者Liam Spring
相关产品推荐
相关产品推荐

