【发布时间】:2016-08-18 07:30:27
【问题描述】:
我似乎无法找出如何向量化这个 py3 循环
import numpy as np
a = np.array([-72, -10, -70, 37, 68, 9, 1, -3, 2, 3, -6, -4, ], np.int16)
result = np.array([-72, -10, -111, -23, 1, -2, 1, -3, 1, 2, -5, -5, ], np.int16)
b = np.copy(a)
for i in range(2, len(b)):
b[i] += int( (b[i-1] + b[i-2]) / 2)
assert (b == result).all()
我尝试使用np.convolve 和pandas.rolling_apply,但无法正常工作。也许现在是学习 c-extensions 的时候了?
对于大约 500k 个元素的输入数组,将时间缩短到 50..100 毫秒会很棒。
@hpaulj 在他的回答中要求b[k] 的封闭表达式为a[:k]。我不认为它存在,但我对其进行了一些研究,并且确实发现封闭形式包含一堆 Jacobsthal 数字,正如@Divakar 指出的那样。
这是一个封闭的形式:
J_n 这里是Jacobsthal number,当这样展开时:
J_n = (2^n - (-1)^n) / 3
最终得到一个表达式,我可以想象它使用矢量化实现......
【问题讨论】:
-
但是
b和result是不同的,对吧?哪个是正确的预期输出? -
@Divakar 整数除法问题可能吗?它们在 Python 3.5 中是相同的。
-
@ayhan 没错,这应该在 py3.5 上运行。 @Divakar 正确的预期输出是
result -
@ayhan 是的,因为当我们使用
2.0进行除法时它可以工作。 -
好吧,似乎封闭形式将遵循 Jacobsthal 数。所以,也许调查一下。
标签: python-3.x numpy