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

时间:2017-08-17 10:59:50

标签: python arrays numpy random

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

x = [True, True, False, False, False, True, False, True, True, True, False, True, True, False]

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

可能的结果可能是:

x = [True, True, False, False, False, False, False, False, False, False, False, False, True, False]

如何实施?

2 个答案:

答案 0 :(得分:4)

一种方法是 -

# 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

示例运行 -

# 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)

答案 1 :(得分:0)

使用所需数量TrueFalse构建一个数组,然后将其改组

import random
def buildRandomArray(size, numberOfTrues):
    res = [False]*(size-numberOfTrues) + [True]*numberOfTrues
    random.shuffle(res)
    return res

Live example