【发布时间】:2019-03-15 09:28:20
【问题描述】:
假设我有一个包含三个函数的列表:
f_list = [f1,f2,f3]
和一个值数组,每个函数都应该被计算
values = numpy.array([1,2,3])
这样我得到 f1(1)、f2(2) 和 f3(3)。
一种方法当然是循环函数:
for i in range(3):
print(f_list[i](values[i])
有没有更有效的方法来做到这一点?类似于 numpy 数组操作的东西,我可以一次传递所有值以获取函数评估数组? 据我所知,我不能将函数存储在 numpy 数组中,可以吗?
在我的例子中,我有一个非常大的 scipy 插值 (interp1d) 函数(或调用对象)的 2D 列表,当在两个轴上循环时需要很长时间来评估。
【问题讨论】:
-
我认为你想使用
map,尽管它对 numpy 不是很有效。还有vectorize装饰器:docs.scipy.org/doc/numpy-1.13.0/reference/generated/… -
你确定你的程序需要很长时间是因为未优化的循环而不是不可避免的函数调用本身吗?
-
"据我所知,我不能将函数存储在 numpy 数组中,可以吗?"您可以将任何内容存储在 numpy 数组中;但如果它不是 numpy 原生的,它会得到
dtype=object,如果 numpy 对速度有任何好处,你就会变得稀缺(尽管你仍然可以使用高级操作功能)。我可能只是做y = [f(x) for f, x in zip(f_list, values)]或类似的 - 与您的代码一样的速度,但对我来说更具可读性 -
你用的是什么版本的 Python?
-
Python 的内置 zip() [ 或者 izip() ] 函数。不过你仍然需要一个循环。
标签: python arrays performance function numpy