如何解决Numpy中2维数组逐行减1维数组结果异常的问题
问题原因
你得到的运算结果是完全正确的,并不是广播机制运行异常,问题出在你对运算结果的预期计算错误:
- 第一行参与运算的两个数组为
[10,11,12,13,14]和[1,2,3,4,5],按位相减的结果为10-1=9、11-2=9、12-3=9、13-4=9、14-5=9,和你实际得到的输出完全匹配 - 之前使用
[10,20,30,40,50]做运算时,按位相减的结果刚好是逐次递减的数值,让你误以为这才是通用运算逻辑,实际两次运算都严格遵循numpy的广播规则,没有异常
更简洁的实现方案
numpy原生支持二维数组直接和长度匹配的一维数组按行广播相减,不需要额外写循环:
import numpy as np lst1 = [[10,11,12,13,14], [20,21,22,23,24], [30,31,32,33,34]] lstave = [1,2,3,4,5] arr1 = np.array(lst1) arrave = np.array(lstave) # 直接做减法即可自动按行广播 res = arr1 - arrave print(res)
输出结果和你循环计算的结果一致:
[[ 9 9 9 9 9] [19 19 19 19 19] [29 29 29 29 29]]
如果你需要每行所有元素减去一维数组的首个元素
如果你的实际需求是每行所有元素统一减去一维数组的第一个值(比如lstave = [1,2,3,4,5]时所有元素都减1),可以用如下写法实现:
# 取一维数组第一个元素做标量减法即可 res = arr1 - arrave[0]
输出结果:
[[ 9 10 11 12 13] [19 20 21 22 23] [29 30 31 32 33]]
内容的提问来源于stack exchange,提问作者Ihmon
相关产品推荐
相关产品推荐

