例如,如果我想有条件地添加,我可以使用:
y = numpy.where(condition, a+b, b)
有没有办法直接合并ufunc
和where
?类似的东西:
y = numpy.add.where(condition, a, b)
答案 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
足以让您知道。