gpt4 book ai didi

python - 如何优化 Python 中的嵌套 for 循环

转载 作者:太空狗 更新时间:2023-10-29 20:16:27 40 4
gpt4 key购买 nike

所以我正在尝试编写一个 python 函数来返回一个称为 Mielke-Berry R 值的指标。指标的计算方式如下: enter image description here

我目前写的代码是可行的,但是由于方程中的总和,我唯一能想到的解决它的方法是在 Python 中使用嵌套的 for 循环,这非常慢...

下面是我的代码:

def mb_r(forecasted_array, observed_array):
"""Returns the Mielke-Berry R value."""
assert len(observed_array) == len(forecasted_array)
y = forecasted_array.tolist()
x = observed_array.tolist()
total = 0
for i in range(len(y)):
for j in range(len(y)):
total = total + abs(y[j] - x[i])
total = np.array([total])
return 1 - (mae(forecasted_array, observed_array) * forecasted_array.size ** 2 / total[0])

我将输入数组转换为列表的原因是因为我听说(尚未测试)使用 python for 循环索引 numpy 数组非常慢。

我觉得可能有某种 numpy 函数可以更快地解决这个问题,有人知道吗?

最佳答案

这是一种利用 broadcasting 的矢量化方法得到总计 -

np.abs(forecasted_array[:,None] - observed_array).sum()

要同时接受列表和数组,我们可以使用 NumPy 内置的外部减法,就像这样 -

np.abs(np.subtract.outer(forecasted_array, observed_array)).sum()

我们还可以利用 numexpr module为了更快的 absolute 计算和执行 summation-reductions 在一个单一的 numexpr evaluate 调用中,这样会更有内存效率,就像这样 -

import numexpr as ne

forecasted_array2D = forecasted_array[:,None]
total = ne.evaluate('sum(abs(forecasted_array2D - observed_array))')

关于python - 如何优化 Python 中的嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876828/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com