使用类似于numpy.where的ufunc

时间:2017-03-27 12:41:54

标签: numpy

例如,如果我想有条件地添加,我可以使用:

y = numpy.where(condition, a+b, b)

有没有办法直接合并ufuncwhere?类似的东西:

y = numpy.add.where(condition, a, b)

1 个答案:

答案 0 :(得分:0)

该行的某些内容是add.at

In [21]: b = np.arange(10)
In [22]: cond = b%3==0

您的where

In [24]: np.where(cond, 10+b, b)
Out[24]: array([10,  1,  2, 13,  4,  5, 16,  7,  8, 19])

使用另一个where(或np.nonzeros)将布尔掩码转换为索引元组

In [25]: cond
Out[25]: array([ True, False, False,  True, False, False,  True, False, False,  True], dtype=bool)
In [26]: idx = np.where(cond)
In [27]: idx
Out[27]: (array([0, 3, 6, 9], dtype=int32),)

add.at进行了无补充的无补充:

In [28]: np.add.at(b,idx[0],10)
In [29]: b
Out[29]: array([10,  1,  2, 13,  4,  5, 16,  7,  8, 19])

add.at旨在通过更直接的索引+=来解决缓冲问题:

In [30]: b = np.arange(10)
In [31]: b[idx[0]] += 10
In [32]: b
Out[32]: array([10,  1,  2, 13,  4,  5, 16,  7,  8, 19])

此处的操作相同(add.at较慢)。但如果idx中有重复项,则结果会有所不同。

+=也适用于布尔掩码:

In [33]: b[cond] -= 10
In [34]: b
Out[34]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

必须有ufunc等同于+=运算符,但我不会使用ufunc足以让您知道。