如何使用布尔掩码混合两个numpy数组,以有效地创建一个相同的大小?

时间:2016-06-03 15:17:20

标签: python arrays performance numpy mask

我使用两个相同大小的数组,如:

>>> a = [range(10)]
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = -a
>>> b
array([ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9])

我想使用布尔"掩码"创建另一个数组,例如:

>>> m = (a % 2 == 0)
>>> m
array([ True, False,  True, False,  True, False,  True, False,  True, False], dtype=bool)

然后我创建了一个相同大小的第三个数组,并将其值改为if,如果m为True,则b的值为m,如果m为False:

>>> c = ones(10)
>>> c[m] = a[m]
>>> c[~m] = b[~m]
>>> c
array([ 0., -1.,  2., -3.,  4., -5.,  6., -7.,  8., -9.])

我想知道是否有办法在一次操作中完成最后三次操作(创建c)(特别是对于性能优化)。

做的问题:

  
    
      

c = a * m + b * m

    
  

当a或b中有NaN时,当它乘以零时,它仍会产生NaN。

PS:我给出的例子也适用于n维数组。

2 个答案:

答案 0 :(得分:8)

您正在寻找numpy.where

c = numpy.where(m, a, b)
祝你好运。

答案 1 :(得分:0)

使用列表推导可以创建一些条件来确定要选择哪个列表?

result = [ a[i] if bol else b[i] for i, bol in enumerate(mask)]

然后你可以将一些函数应用到[i]或b [i],具体取决于你想要如何改变它们。