使用交互元素对 for 循环进行矢量化



我正在学习矢量化我的代码,目前我的代码正遭受严重的时间问题。我的目标是摆脱所有减慢该过程的循环。每当我不需要知道步骤 i 的结果来计算步骤 i+1 时,这就可以正常工作。

在某一时刻,这不再成立。我试图将问题分解为这个简化的片段:

x2 = np.arange(10)
f1, sumint = 0.0, 0.0
for i in x2:
f2 = np.exp(x2[i]) + f1
sumint += f2
f1 = f2

当然,可以计算整个矩阵的项np.exp(x2[i])。但是 f1 是一个带有我事先不知道的 i-1 结果的术语(或者,我?

我正在寻找这个问题的numpy解决方案,因为真正的代码涉及更复杂的计算和更多的变量,如f1。我知道numpy.vectorize但文档说这不会加快代码速度,而是有助于可读性。

编辑:也许这个例子更适合展示我的实际案例......

x2 = np.random.rand(10)
y2 = np.random.rand(10)
f2 = np.random.rand(10)
sumint, f1, x1, y1 = 0, 0, 0, 0
for i in range(10):
sumint += (f2[i] - f1) * (x2[i] - x1) / (y2[i] - y1)
x1 = x2[i]
y1 = y2[i]
f1 = f2[i]

编辑2:抱歉,我找到了解决方案。通过分解问题的核心,我发现我认为的递归只是一个SHIFT。问题的解决方案是:

f1 = np.zeros(10)
x1 = np.zeros(10)
y1 = np.zeros(10)
x1[1:] = x2[:-1]
y1[1:] = y2[:-1]
f1[1:] = f2[:-1]
sumint = (f2 - f1) * (x2 - x1) / (y2 - y1)

我现在可以将其应用于真实案例。

您可以使用1 次调用np.cumsum和 1 次调用np.exp来执行此操作:

sumint = np.sum(np.cumsum(np.exp(x2)))

如果您还需要f1f2的值:

f1 = f2 = sum(np.exp(x2))

这将提供与代码相同的值,但已矢量化。

最新更新