如何在避免除零错误的前提下,实现特征图与2D常量张量的维度匹配除法运算?
如何在避免除零错误的前提下,实现特征图与2D常量张量的维度匹配除法运算?
嘿,这个问题我做CV特征处理的时候也踩过坑!核心问题就是numpy的广播规则是从右往左对齐维度的,你的b张量形状是(4,3),numpy会默认把它当成在最前面补一个维度变成(1,4,3),这就和a的(4,3,3)维度对应不上了。不过解决起来超简单,只要给b扩展一个最后维度,让它能和a从右往左对齐就行,同时保留你原来的where条件避免除零错误。
给你两种实用的写法:
方法一:用np.expand_dims显式扩展维度
这种写法可读性强,适合刚接触numpy的朋友:
import numpy as np a = np.random.rand(4, 3 ,3) b = np.random.rand(4, 3) # 给b在最后一个位置添加维度,形状从(4,3)变成(4,3,1) b_expanded = np.expand_dims(b, axis=-1) # 现在两个张量可以正常广播了,where条件也能正确过滤零值 c = np.divide(a, b_expanded, where=b_expanded > 0)
方法二:用[..., None]快速扩展维度
这是numpy老玩家常用的简洁写法,...代表前面所有维度,None相当于新增一个维度:
import numpy as np a = np.random.rand(4, 3 ,3) b = np.random.rand(4, 3) # 一行搞定维度扩展和除法,where条件里直接用b>0也可以(因为扩展维度不改变元素值) c = np.divide(a, b[..., None], where=b > 0)
为什么这样能行?当b变成(4,3,1)后,numpy会自动把这个长度为1的维度扩展到和a的最后一个维度(长度3)匹配,这样两个张量的每个位置元素就能正确对应做除法了,完全符合你想要的特征图每个通道都除以对应位置的2D常量的需求。
备注:内容来源于stack exchange,提问作者PuppyCat
相关产品推荐
相关产品推荐

