如何在numpy数组中应用条件语句?

时间:2019-07-13 07:44:12

标签: python pandas conditional-statements numpy-ndarray

我试图在numpy数组中应用条件语句,并获取具有1和0值的布尔数组。

到目前为止,我尝试了np.where(),但是它只允许3个参数,而在我的情况下,我还有更多参数。

我首先随机创建一个数组:

numbers = np.random.uniform(1,100,5)

现在,如果值小于30,我想得到0。如果值大于70,我想得到1。如果值在30到70之间,我想得到得到一个介于0和1之间的随机数。如果该数字大于0.5,则数组中的值应作为布尔值获得1,在其他情况下应为0。我想这是使用np.random函数再次实现的,但是我不知道如何应用所有参数。

如果输入数组为:

[10,40,50,60,90]

则预期输出应为:

[0,1,0,1,1]

其中中间的三个值是随机分布的,因此在进行多个测试时它们可以不同。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

使用numpy.select,第三个条件应简化为numpy.random.choice

numbers = np.array([10,40,50,60,90])
print (numbers)
[10 40 50 60 90]

a = np.select([numbers < 30, numbers > 70], [0, 1], np.random.choice([1,0], size=len(numbers)))
print (a)
[0 0 1 0 1]

如果需要3rd条件且比较条件为0.5,可以将掩码从True, False转换为1, 0的整数:

b = (np.random.rand(len(numbers)) > .5).astype(int)
#alternative
#b = np.where(np.random.rand(len(numbers)) > .5, 1, 0)

a = np.select([numbers < 30, numbers > 70], [0, 1], b)

或者您可以链接3次numpy.where

a = np.where(numbers < 30, 0,
    np.where(numbers > 70, 1, 
    np.where(np.random.rand(len(numbers)) > .5, 1, 0)))

或使用np.select

a = np.select([numbers < 30, numbers > 70, np.random.rand(len(numbers)) > .5], 
               [0, 1, 1], 0)