NumPy的.reduce()是一个foldl,从左到右减少:
.reduce()
foldl
>>> np.subtract.reduce(np.array([1, 2, 3])) -4
那么(1-2)-3 .有没有一种标准的numpy方法来代替foldr(从右到左),也就是在这个简单的例子中得到1-(2-3)?
(1-2)-3
foldr
1-(2-3)
jogvjijk1#
AFAIK,Numpy中没有从右到左的减少:所有的归约都是从左到右进行的。当二元运算符是结合运算符时,foldl方法在分析上等价于foldr(使用浮点数时,它在数值上可能会不同,但以这种方式改变排序通常没有用,除非在极少数情况下,如指数递减排序数)。在np.subtract.reduce的特定情况下,不需要foldr方法。实际上:
np.subtract.reduce
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方法,以便快速实现。
1条答案
按热度按时间jogvjijk1#
AFAIK,Numpy中没有从右到左的减少:所有的归约都是从左到右进行的。当二元运算符是结合运算符时,foldl方法在分析上等价于foldr(使用浮点数时,它在数值上可能会不同,但以这种方式改变排序通常没有用,除非在极少数情况下,如指数递减排序数)。在
np.subtract.reduce
的特定情况下,不需要foldr方法。实际上:这意味着可以用途:
在Numpy中不需要实现foldr reduction,一般的方法是编写一个用户定义的函数reduction:
这种方法的缺点是速度不是很快,因为CPython函数每次都是从原生C Numpy代码中解释和调用的。
或者,您可以使用Numba编写自己的foldr reduction方法,以便快速实现。