【问题标题】:vectorize recursive function of numpy array where each element depend on all of the previous ones向量化numpy数组的递归函数,其中每个元素都依赖于之前的所有元素
【发布时间】:2021-11-16 22:40:05
【问题描述】:

是一个 ndarray,例如。 g.:

a = np.random.randn(Size)

Where Size >> 1. 是否可以定义一个数组 b s.t.它的第 i 个元素依赖于 a 到 i 的所有元素(排除或包含不是问题)而没有 for 循环?

b[i] = function(a[:i])

所以如果函数只是 np.sum(a[:i]) 我想要的输出将是:

for i in range(1, Size):
    b[i] = np.sum(a[:i])

我能想到的唯一解决方案是编写相应的C代码并包装它,但是有一些python原生解决方案可以避免它吗???

我强调总和只是一个例子,我正在寻找对任意函数的概括,但是,可以通过 numpy 数学函数(例如 np.exp())逐元素表示

【问题讨论】:

  • 那么您是否尝试使用 Python 解决它并且太慢了?您发布的代码是 O(n^2),它可以在 O(n) 中完成,用于求和和乘法等简单操作。
  • 许多ufunc 都有一个accumulate 方法。 np.cumsum 基本上是 np.add.accumulate。但是如果你不能使用其中一个,或者一些巧妙的组合,并且你仍然想要速度,你将需要编写某种编译代码。 numba 现在似乎是首选工具。
  • @DaniMesejo 这正是重点......
  • @hpaulj 您应该将其发布为答案,我认为您正确地抓住了重点,并且推理对我有用

标签: python numpy vectorization


【解决方案1】:

许多ufunc 都有一个accumulate 方法。 np.cumsum 基本上是 np.add.accumulate。但是如果你不能使用其中一个,或者一些巧妙的组合,并且你仍然想要速度,你将需要编写某种编译代码。 numba 现在似乎是首选工具。

【讨论】:

    【解决方案2】:

    在您的示例中,仅使用 numpy cumsum 操作 https://numpy.org/doc/stable/reference/generated/numpy.cumsum.html

    编辑:

    例如,如果您创建的 a = np.ones(10) 的所有值都等于 1。那么 b = np.cumsum(a) 将包含 [1 2 ... 10]。

    或者如你所愿:

    for i in range(1, Size):
        b[i] = np.sum(a[:i])
    

    您还可以指定轴以应用 cumsum 或使用 numpy.cumprod(操作相同,但使用产品)。

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • 虽然这解决了 OP 的简单示例,但它并没有回答 OP 的实际问题,这似乎是他们想要使用任意函数进行累积/减少。
    • @ddejohn,如果您对这个答案很挑剔,请尝试自己编写:) OP 要求我发表我的评论作为答案。这并没有增加太多。
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多