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

如何在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)

代码说明

  1. 初始化结果数组:用np.full_like直接创建和原数组形状一致、全为999的数组,避免后续处理非目标位置。
  2. 定位非零区域:通过np.where快速获取每行非零元素的索引位置。
  3. 生成随机序列:先创建固定的[0,0,0,1]数组,再用np.random.shuffle打乱顺序,确保恰好是3个0+1个1的随机排列。
  4. 赋值替换:将打乱后的序列直接赋值到对应的非零索引位置。

示例输出

每次运行结果会随机变化,但每行非零区域必然是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:35:36