【问题标题】:Apply function n times using all previous results使用所有先前的结果应用函数 n 次
【发布时间】:2018-05-02 18:26:28
【问题描述】:

我想知道是否有一种 Python 的方法可以多次应用一个函数,其中 all 最后的结果是再次使用列表理解或生成器表达式而不是像这样的 for 循环的输入?

import numpy as np

def func(x, s):
    return (5+sum(x))**(-1.06)/s

y = np.array([])
for i in range(5):
    y = np.append(y, func(y[:i], s=i+1))

编辑:不幸的是,itertools.accumulate 似乎只考虑了最后一个结果,而不是所有最后一个结果。还有什么想法吗?

【问题讨论】:

  • 寻找-list comprehension or generator expression instead of a for loop 背后的想法是什么?是性能还是其他?
  • 是的,有。它被称为functools.reduce
  • 兴趣、表现和使用一个班轮。
  • 这对你有用吗? [func(range(i), i+1) for i in range(5)] 并将其包含在 np.array 调用中?它依赖于 func 期望串行整数。如果您特别依赖列表中已有的数字,即您的情况,我不确定您是否可以理解。
  • @Love Tätting 这不会产生与我认为它不依赖于列表中已有数字的结果相同的结果,对吧?

标签: python function numpy list-comprehension generator-expression


【解决方案1】:

貌似没有内置,但制作起来很简单:

def pastmap(f, inputs):
    """
    :param f: A function of the form y[i] = f(y[:i], inputs[i])
    :param inputs: An iterable of inputs
    :return: A list of length: len(inputs)
    """
    results = []
    for x in inputs:
        new_result = f(results, x)
        results.append(new_result)
    return results


def func(x, s):
    return (5+sum(x))**(-1.06)/s


y = np.array(pastmap(func, range(1, 6)))

请注意,至少对于您的示例,这样做效率非常低,因为您反复获取不断增长的列表的总和,即 O(N^2)(最好 (O(N)) 保持运行总结并使用它)

【讨论】:

  • 这只是一个例子。感谢您的代码。一个问题:for循环更快吗?这就是为什么我实际上在寻找列表理解或生成器表达式解决方案。干杯!
  • 可能不会更快,因为它只是将循环移动到更通用的函数中。但循环也可能不是你代码的主要瓶颈,或者如果是的话,它应该被移动到 numpy 或其他东西中。
  • 将循环移入numpy是什么意思?
  • 嗯,很多时候你可以将循环移动到像 np.cumsum 这样的 numpy 操作中,但我承认在你的情况下,每个输出都是前一个输出的一些非线性函数,你不能.如果你在 Python 2.X 中,python 循环的缓慢确实是你的瓶颈,scipy weave docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/weave.html 可以让你快速迭代。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2020-08-19
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 2013-02-23
相关资源
最近更新 更多