np.less.reduce沿axis=1归约二维数组结果不符合预期是什么原因
核心误区
你错误认为所有二元运算的reduce行为都和加法一致,实际上只有满足结合律的运算用reduce才能得到直觉上的预期结果,<(对应np.less)这类比较运算不满足结合律,reduce的执行逻辑和你想要的效果完全不同。
reduce的实际执行逻辑
np.ufunc.reduce会迭代将二元运算符作用在前一步的运算结果和序列的下一个元素上:
- 对于
np.add这类满足结合律的运算,add.reduce([a,b,c])等价于a + b + c,运算顺序不影响最终结果,因此符合你的预期。 - 对于
np.less来说,less.reduce([a,b,c])实际执行的是(a < b) < c:前一步比较得到的布尔值会被隐式转换为整数(True转1、False转0)参与后续比较,和你想要的「判断a < b 且 b < c」完全是两种逻辑。
正确实现方式
如果你需要判断每一行的元素是否严格递增,应该先对相邻元素做比较,再用逻辑与归约:
import numpy as np arr = np.array([[1, 2], [3, 1]]) result = np.all(np.less(arr[:, :-1], arr[:, 1:]), axis=1) # 输出为 array([ True, False]),符合你的预期
内容的提问来源于stack exchange,提问作者xpqz
相关产品推荐
相关产品推荐

