【发布时间】:2019-12-16 08:34:10
【问题描述】:
我想对由(复杂的)参数函数定义的一系列向量求和。有没有办法在下面的代码中使用矢量化代替嵌套的 for 循环来为 ans 获得相同的值?内存使用不应成为约束。请注意,对于实际问题,已知嵌套 for 循环会限制性能,尽管此处并非如此。
import numpy as np
a1_vec = np.array([0.3, 1])
a2_vec = np.array([3.3, 10])
b1_vec = np.array([0.5, 0.7])
b2_vec = np.array([1.5, 1.3])
x = np.arange(0, 10000)
ans = 0
for a1, b1 in zip(a1_vec, b1_vec):
for a2, b2 in zip(a2_vec, b2_vec):
ans += x*np.exp(- a1 - b2) + x**(1 / 2)*np.cos(b1) + x**(1 / 3)*np.sin(a2)
【问题讨论】:
-
x[:,None,None] * np.exp(-a1_vec[None,None,:]-b2_vec[None,:,None]应该给出一个 (10000,2,2) 数组,可以是np.sum(...)。其他术语类似 -
@hpaulj 你能说更多关于你在评论中发表的内容吗?如果您添加答案,我很乐意接受。
-
有趣 - 嵌套循环代码实际上更快。我想知道用 numpy、cython 是否有更快的方法来做到这一点?
-
这确实很有趣且出乎意料,显然python3实际上加强了它的游戏。这甚至适用于更长的 x 向量吗?所以 1e5 或 1e6 在范围内?
-
您可以尝试的另一件事是 [numba][numba.pydata.org/] 代码被编译的地方。我会在 cython 之前尝试这个。平心而论,您的问题似乎足够小,为什么还要进一步优化?
标签: python arrays numpy vectorization