Python reduce函数

文章目录

  • 前言
  • 函数介绍
  • 样例

前言

  • 遇到了一个 reduce 函数的使用,在网上查询的各种博客,其中的例子都是介绍加减乘除,当然官网API也主要介绍这种用法,然而此函数并不仅有这种用法,且没有看到对其原理进行解析的博客。

函数介绍

functools.reduce(function, iterable[, initializer])
将两个参数的 function 从左至右积累地应用到 iterable 的条目,以便将该可迭代对象缩减为单一的值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 是计算 ((((1+2)+3)+4)+5) 的值。 左边的参数 x 是积累值而右边的参数 y 则是来自 iterable 的更新值。 如果存在可选项 initializer,它会被放在参与计算的可迭代对象的条目之前,并在可迭代对象为空时作为默认值。 如果没有给出 initializer 并且 iterable 仅包含一个条目,则将返回第一项。

看介绍不如看源码

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

这个源码还是很容易理解的。

  • function 指的是一个函数,这个函数只有两个参数。这里可以是 def 定义的函数,也可以是 lambda 匿名函数
  • iterable 是一个可迭代对象,比如列表 list,我们会对其中的元素进行迭代,来不断调用 function
  • initializervalue 的初始值。
    • 如果有initializer,那么就将其作为函数的第一个参数,迭代 iterable,将其中的元素作为函数的第二个参数。做完一次之后,再将结果作为第一个参数,iterable 中的元素作为第二个参数
    • 如果没有,就将 iterable 中的第一个数给 value 当做初始值,然后再遍历iterable 其他元素

样例

加减乘除这里就不介绍了,很容易理解,附一个网址reduce函数-菜鸟教程。
这里介绍一个我遇到的情况,是关于对元素进行 mask

def mask_with_tokens(t, token_ids):
    """
    t: sequence
    token_ids: mask_ignore_token_id
    return:
    """
    init_no_mask = paddle.full_like(t, False, dtype=paddle.bool) # 与 t 相同大小,全 False
    mask = reduce(lambda acc, el: acc | (t == el), token_ids, init_no_mask)
    print(f"this is mask: {mask}")
    return mask

seq = paddle.to_tensor([0, 1, 2, 11, 12, 15, 17, 20])
mask_id = [0, 1, 2]
mask_with_tokens(seq, mask_id)

输出就是 [True , True , True , False, False, False, False, False]
init_no_mask 本来全是 False,经过reduce之后,出现在 mask_id 中元素的对应位置变成了Truereduce函数还可以有其他用途,这里建议大家理解好源码。

你可能感兴趣的:(PyTorch,Python,深度学习)