python NumPy中是否存在左右(foldr)缩减?

mwyxok5s  于 2023-01-12  发布在  Python
关注(0)|答案(1)|浏览(113)

NumPy的.reduce()是一个foldl,从左到右减少:

>>> np.subtract.reduce(np.array([1, 2, 3]))
-4

那么(1-2)-3 .有没有一种标准的numpy方法来代替foldr(从右到左),也就是在这个简单的例子中得到1-(2-3)

jogvjijk

jogvjijk1#

AFAIK,Numpy中没有从右到左的减少:所有的归约都是从左到右进行的。当二元运算符是结合运算符时,foldl方法在分析上等价于foldr(使用浮点数时,它在数值上可能会不同,但以这种方式改变排序通常没有用,除非在极少数情况下,如指数递减排序数)。在np.subtract.reduce的特定情况下,不需要foldr方法。实际上:

a_1 - (a_2 - (a_3 - (a_4 - (a_5 - (... - a_n))))) 
= a_1 - a_2 + a_3 - a_4 + a_5 - ... -/+ a_n
= (a_1 + a_3 + a_5 + ... + a_i) - (a_2 + a_4 + a_6 + ... + a_j)

这意味着可以用途:

result = np.add.reduce(arr[::2]) - np.add.reduce(arr[1::2])

在Numpy中不需要实现foldr reduction,一般的方法是编写一个用户定义的函数reduction

f = np.frompyfunc(lambda x,y: y-x, 2, 1)
result = f.reduce(arr[::-1])

这种方法的缺点是速度不是很快,因为CPython函数每次都是从原生C Numpy代码中解释和调用的。
或者,您可以使用Numba编写自己的foldr reduction方法,以便快速实现。

相关问题