从数组的特定元素中选择随机元素

pyi*_*gal -1 python arrays random numpy

我有一个带有布尔值的一维(numpy)数组。例如:

x = [True, True, False, False, False, True, False, True, True, True, False, True, True, False]
Run Code Online (Sandbox Code Playgroud)

该数组包含8True 值。例如,我想从存在的值中随机保留38在这种情况下必须小于)作为 True 值8。换句话说,我想将5这些8True 值随机设置为 False。

可能的结果是:

x = [True, True, False, False, False, False, False, False, False, False, False, False, True, False]
Run Code Online (Sandbox Code Playgroud)

如何实施?

Div*_*kar 5

一种方法是 -

# Get the indices of True values
idx = np.flatnonzero(x)

# Get unique indices of length 3 less than the number of indices and 
# set those in x as False
x[np.random.choice(idx, len(idx)-3, replace=0)] = 0
Run Code Online (Sandbox Code Playgroud)

样品运行 -

# Input array
In [79]: x
Out[79]: 
array([ True,  True, False, False, False,  True, False,  True,  True,
        True, False,  True,  True, False], dtype=bool)

# Get indices
In [80]: idx = np.flatnonzero(x)

# Set 3 minus number of True indices as False
In [81]: x[np.random.choice(idx, len(idx)-3, replace=0)] = 0

# Verify output to have exactly three True values
In [82]: x
Out[82]: 
array([ True, False, False, False, False, False, False,  True, False,
       False, False,  True, False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)