无法理解*解包运算符在np.logical_and调用中的作用
*运算符在该Numpy代码中的作用原理
1. 先明确np.logical_and的参数规则
- 基础的
np.logical_and支持接收多个布尔数组作为输入,输出逐元素判断所有输入数组对应位置均为True的布尔数组,早期版本仅支持2个输入,高版本Numpy已支持传入任意数量的输入数组。
2. 代码中生成器表达式的作用
(a[..., channel] == pixel_values[channel] for channel in range(a.shape[-1]))是一个生成器对象:
- 遍历图像的每个通道(示例中为3通道),逐通道判断当前像素的通道值是否等于目标类别的对应通道值
- 会依次产出和图像宽高尺寸一致的3个布尔数组
3. *运算符的实际作用
这里的*是可迭代对象解包运算符,它的作用范围不局限于列表、字典,所有可迭代对象(生成器、元组、集合等)都支持解包:
- 加*后会把生成器中产出的3个布尔数组,按顺序作为位置参数依次传入
np.logical_and - 等效于手动写
np.logical_and(通道1布尔数组, 通道2布尔数组, 通道3布尔数组),最终得到的mask就是三个通道都匹配目标值的像素位置
4. 去掉*报错的原因
如果去掉*,相当于直接把整个生成器对象作为第一个参数传入np.logical_and,函数接收到的不是合法的布尔数组输入,同时缺少必要的第二个参数,自然无法正常运行。
你可以用以下等价写法来理解执行逻辑:
# 3通道场景下的等价手动实现,和原代码效果完全一致 c0_mask = a[..., 0] == pixel_values[0] c1_mask = a[..., 1] == pixel_values[1] c2_mask = a[..., 2] == pixel_values[2] mask = np.logical_and(np.logical_and(c0_mask, c1_mask), c2_mask)
内容的提问来源于stack exchange,提问作者Corentin Salomon
相关产品推荐
相关产品推荐

