numpy 如何随机0或1并替换Python数组中的值?

pes8fvy9  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(113)

对于我的编码:

In[1]:
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) 
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)
    j=j+1
i=i+1
numpy_array = np.array(array_new)
array_new = numpy_array.reshape(2,12) 
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]])

字符串
有没有什么方法可以使TC数组中每一行中大于零的值(如2000 1000)成为 * 随机值,由三个0和一个1组成,然后每行替换它?

Target
Out[2]:
array([[999, 999, 999, 999, 999,   *0,   *0,   *0,   *1, 999, 999, 999],  
       [999,   *1,   *0,   *0,   *0, 999, 999, 999, 999, 999, 999, 999]])


提前感谢

nr7wwzry

nr7wwzry1#

给定一个数组:

arr = np.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]])

字符串
看起来你想用三个0和一个1随机替换每行中的四个值。为此,您首先需要选择要替换的四个值:

gt_zero = arr > 0
eq_zero = arr == 0


这将创建两个与arr形状相同的布尔数组,其中条件为true时为True,条件为false时为False
现在,由于您知道每行都保证有四个非零值,因此可以预先构建一个Nx4替换值数组。首先,创建一个零数组。然后,为每行选择一个随机列插入1。然后,使用np.put_along_axis将该列中的元素替换为1

replacements = np.zeros((arr.shape[0], 4))
random_column = np.random.randint(0, 4, (arr.shape[0], 1))
np.put_along_axis(replacements, random_column, 1, 1)


在这段代码的结尾,replacements看起来像这样:

array([[0., 1., 0., 0.],
       [0., 0., 0., 1.]])


最后,将arr中的元素替换为replacements。请注意,您需要将replacements扁平化,以便能够使用布尔索引设置值:

arr[gt_zero] = replacements.flatten()
arr[eq_zero] = 999


这给了你以下(示例)arr

array([[999, 999, 999, 999, 999,   0,   1,   0,   0, 999, 999, 999],
       [999,   0,   0,   0,   1, 999, 999, 999, 999, 999, 999, 999]])

5anewei6

5anewei62#

一个选择:

# identify values >= 1000
m = arr>=1000

# create output
new_arr = np.where(m, 0, 999)

# generate random array of size len(arr)/4 with one 1 per row
tmp = np.random.random((arr.shape[0], 4))

# assign it using the mask
new_arr[m] = (tmp == tmp.max(1)[:,None]).astype(int).ravel()

字符串
示例输出:

array([[999, 999, 999, 999, 999,   0,   0,   0,   1, 999, 999, 999],
       [999,   0,   1,   0,   0, 999, 999, 999, 999, 999, 999, 999]])

相关问题