Python 使用累加器和任意 lambda 函数进行归约?

2023-11-22

通过累积执行归约的 Pythonic 方式是什么?

例如,采取R's Reduce()。给定一个列表和任意 lambda 函数,它允许通过设置生成累积结果的向量,而不仅仅是最终结果accumulate=T。一个简单的乘法作为 lambda 函数的例子是(取自这个答案):

Reduce(`*`, x=list(5,4,3,2), accumulate=TRUE)
# [1]   5  20  60 120

重要的是任意 lambda 函数(例如lambda x, y: ...)可以使用,因此解决方案允许例如仅使用求和、乘法或其他方法无法解决问题。我无法想出一个 Pythonic 解决方案来做到这一点,例如蟒蛇的itertools or functools,但也许有办法。尽管还有许多关于减少和特别是使用 Python 进行积累的其他问题和答案,但到目前为止我还没有找到通用的答案。

使用循环通过任意 lambda 函数执行累积归约的非 Pythonic 示例可能如下所示:

# the source list
l = [0.5, 0.9, 0.8, 0.1, 0.1, 0.9]
# the lambda function for aggregation can be arbitrary
# this one is just made up for the example
func = lambda x, y: x * 0.65 + y * 0.35 

# the accumulated reduce:
# a) the target list with initializer value hardcoded
l2 = [l[0]]
# b) the loop
for i in range(1, len(l)):
    l2 += [func(
            l2[i-1],    # last value in l2
            l[i]        # new value from l   
            )]

那么:如何以 Python 方式通过累加和任意 lambda 函数进行归约?


在Python 3中(3.2中引入,能够传递3.3中添加的函数),这已经实现了,在itertools.accumulate。只需像这样使用它:

from itertools import accumulate
list(accumulate([5, 4, 3, 2], lambda a, b: a*b))
# [5, 20, 60, 120]

如果您使用的是早期的Python版本,或者想自己实现它,并且您确实想要任意的lambda(需要两个参数)才能工作,然后您可以使用上述文档中给出的生成器:

def accumulate(iterable, func=operator.add):
    'Return running totals'
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
    it = iter(iterable)
    try:
        total = next(it)
    except StopIteration:
        return
    yield total
    for element in it:
        total = func(total, element)
        yield total

用法和上面完全一样。


如果您正在使用numpy,那么存在一个更快的解决方案,至少对于所有numpy.ufuncs。这些包括与标准库模块基本相同的功能math提供,然后是一些。您可以找到完整的列表here.

Every numpy.ufuncaccumulate方法,所以你可以这样做:

import numpy as np
np.multiply.accumulate([5, 4, 3, 2])
# array([  5,  20,  60, 120])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 使用累加器和任意 lambda 函数进行归约? 的相关文章

随机推荐

  • 为什么我的比较方法有时会抛出 IllegalArgumentException?

    我遇到这个问题已经有一段时间了 搜索了很多 StackOverflow 问题但无法解决我的问题 我之前也问过类似的问题并得到了使用建议 System setProperty java util Arrays useLegacyMergeSo
  • 计算整数数组中的重复元素

    我有一个整数数组crr array我想计算重复出现的元素 首先 我读取数组的大小并使用从控制台读取的数字对其进行初始化 在数组中new array 我存储重复的元素 数组times存储元素连续出现的次数 然后 我尝试搜索重复序列并以特定格式
  • 文件“xxx.mp4”无法打开,因为您无权查看它

    我使用阿拉莫菲尔方法multipartFormData append URL withName file 将视频上传到服务器 但我收到一条错误消息 multipartEncodingFailed Alamofire AFError Mult
  • 无效的回发或回调参数错误?

    我有两个下拉列表 我使用 javascript 根据另一个下拉列表填充一个 在我的 javascript 代码中 我调用一个网络服务 并根据返回的结果填充另一个下拉列表 问题是 在我成功完成此操作后 开始出现以下错误 回发或回调参数无效 事
  • python中的学生t置信区间

    我有兴趣使用 python 计算学生 t 的置信区间 我在 Mathematica 中使用 StudentTCI 函数 现在需要在 python 中编写相同的函数http reference wolfram com mathematica
  • NOTIFYICONDATA - GUID 问题

    根据 NOTIFYICONDATA 结构的 guidItem 成员的描述http msdn microsoft com en us library bb773352 v vs 85 aspx使用 Windows 系统托盘的程序需要在 Win
  • Sweave 输出中的语法高亮显示

    有没有人设法让颜色语法突出显示在outputSweave 文档 我已经能够通过在中添加框等来自定义输出样式Sweave sty文件如下 DefineVerbatimEnvironment Sinput Verbatim fontseries
  • 如何在一个类中多次使用一个特征?

    以下代码 trait T function foo class C use T T foo as bar use T T foo as baz 产生以下错误 Trait方法bar还没有应用 因为有碰撞 与 C 上的其他特征方法 是否可以在一
  • JQuery 函数的持久化

    我正在尝试为 HTML 设置点击回调 使另一个节点变得可见 一路走来 我惊讶地发现以下两条语句并不等价 title click content toggle title click function content toggle 当最终单击
  • 构建项目时出错:构建播放器时出错,因为脚本在编辑器中存在编译错误

    我有 Tiled2Unity 插件 当我开始在 Unity 中构建游戏版本时 无论是独立版本还是其他版本 我收到以下错误 构建播放器时出错 因为脚本在编辑器中存在编译错误 然后它向我指出了这个课程 using System using Sy
  • 直接从文件系统获取文件校验和,而不是显式计算它

    我猜测典型的文件系统倾向于保留其管理的每个文件的某种校验和 CRC 哈希 因此它可以检测文件损坏 这个猜测正确吗 如果是的话 有没有办法访问它 我主要对 Windows 和 NTFS 感兴趣 但也欢迎对其他平台的评论 语言在这一点上并不重要
  • onCreateLoader 方法中与 AsyncTaskLoader 和 Fragment 一起使用的不兼容类型

    我考虑了一些使用 AsyncTaskLoader 和 Fragment 的示例 https gist github com codeswimmer 884591 我也尝试做同样的事情 但现在我无法修复 onCreateLoader 方法中的
  • Django 1.3 静态文件放置在应用程序目录中

    我正在使用 Django 1 3 应用程序中的静态文件令人困惑 我在做什么 1 设置 STATIC ROOT as path to directory static in my project STATIC URL static 2 在我的
  • 为什么 bool 到 string 的隐式转换不会出错?

    我用谷歌搜索并试图在 SO 上找到类似的问题 但没有找到任何有用的东西 所以 在这里发布我的问题 考虑这个程序 include
  • 写入文本文件php

    我正在使用 php 我想编写一个 php 页面来从另一个页面获取参数并写入文件文本 和 如果已有文件文本 则写入新行 每天创建一个文件文本 Example 注册 php
  • 如何在C#中获取相对路径中的文件

    如果我有一个名为 app exe 的可执行文件 这是我在 C 中编码的内容 那么如何使用相对路径从与 app exe 加载到同一目录中的文件夹中获取文件 这会引发路径异常中的非法字符 string files Directory GetFi
  • 无法在 Android Studio 3.6 上启用 Gradle 的离线模式

    我正在使用新的Android Studio 3 6 金丝雀 9测试新功能 我无法启用 Gradle 的离线模式 在 Android Studio 首选项窗口的 Gradle 选项卡中 我找不到启用它的入口点 这是一个错误还是 Google
  • Xcode 中多个目标的自动递增构建号

    我的应用程序有 免费 和 付费 版本 并且我想同时自动增加两个版本号 因为有时我使用 免费 版本进行测试 有时我使用 付费 版本进行测试 具体取决于关于我正在做的事情 这些本质上是相同的代码库 我只有两个目标 其中带有用 付费 版本定义的预
  • Linux 中的 SEH 等效项或如何处理操作系统信号(如 SIGSERV)并继续继续

    我目前正在开发一个单元测试框架 用户可以在其中创建测试用例并在框架中注册 我还想确保 如果任何用户测试代码导致崩溃 它不应该使整个框架崩溃 而应该被标记为失败 为了实现这项工作 我编写了以下代码 以便我可以在沙盒功能中运行用户代码 bool
  • Python 使用累加器和任意 lambda 函数进行归约?

    通过累积执行归约的 Pythonic 方式是什么 例如 采取R s Reduce 给定一个列表和任意 lambda 函数 它允许通过设置生成累积结果的向量 而不仅仅是最终结果accumulate T 一个简单的乘法作为 lambda 函数的