如何在Python NumPy数组中按规则随机替换非零值?
实现需求:每行非零区域替换为3个0+1个1的随机组合
原始代码与问题
你的现有代码会给每个非零元素独立随机赋值0/1,但无法保证每行非零区域恰好是3个0和1个1的组合。以下是你的原始代码及输出:
# In[1] import numpy as np TC = [[0, 0, 0, 0, 0, 2000, 2000, 2000, 2000, 0, 0, 0], [0, 1000, 1000, 1000, 1000, 0, 0, 0, 0, 0, 0, 0]] a = np.array(TC) arr = a.reshape(2,12) print(arr) # Out[1] # array([[ 0, 0, 0, 0, 0, 2000, 2000, 2000, 2000, 0, 0, # 0], # [ 0, 1000, 1000, 1000, 1000, 0, 0, 0, 0, 0, 0, # 0]])
# In[2] array_new=[] for i in range (2): for j in range (12): rand=np.random.choice([0,1]) y = np.select([arr[i][j] > 0], [rand], 999) array_new.append(y) numpy_array = np.array(array_new) array_new = numpy_array.reshape(2,12) print(array_new) # Out[2] # array([[999, 999, 999, 999, 999, 0, 1, 0, 1, 999, 999, 999], # [999, 1, 1, 1, 1, 999, 999, 999, 999, 999, 999, 999]])
你的目标是:每行中所有大于0的位置(恰好4个)替换为3个0和1个1的随机排列,其余位置设为999。
解决方案代码
直接针对每行的非零区域生成固定比例的随机序列,再赋值到对应位置:
import numpy as np TC = [[0, 0, 0, 0, 0, 2000, 2000, 2000, 2000, 0, 0, 0], [0, 1000, 1000, 1000, 1000, 0, 0, 0, 0, 0, 0, 0]] arr = np.array(TC) # 初始化结果数组,全部填充999 result = np.full_like(arr, 999) for row_idx in range(arr.shape[0]): # 获取当前行所有非零元素的索引 non_zero_positions = np.where(arr[row_idx] > 0)[0] # 生成包含3个0和1个1的基础序列,打乱顺序 random_seq = np.array([0, 0, 0, 1]) np.random.shuffle(random_seq) # 将打乱后的序列赋值到对应位置 result[row_idx, non_zero_positions] = random_seq print(result)
代码说明
- 初始化结果数组:用
np.full_like直接创建和原数组形状一致、全为999的数组,避免后续处理非目标位置。 - 定位非零区域:通过
np.where快速获取每行非零元素的索引位置。 - 生成随机序列:先创建固定的
[0,0,0,1]数组,再用np.random.shuffle打乱顺序,确保恰好是3个0+1个1的随机排列。 - 赋值替换:将打乱后的序列直接赋值到对应的非零索引位置。
示例输出
每次运行结果会随机变化,但每行非零区域必然是3个0和1个1:
[[999 999 999 999 999 0 1 0 0 999 999 999] [999 0 0 1 0 999 999 999 999 999 999 999]]
内容的提问来源于stack exchange,提问作者Agustin
相关产品推荐
相关产品推荐

