python - 将一组函数应用于另一个数组
问题描述
我有一个 numpy 函数数组,我想使用 numpy 的广播规则应用于浮点数组。除了使用 for 循环之外,是否有任何标准方法可以实现这一点?
funcs = np.array([f1, f2, f3]) # each f is of type f(x: float) -> float
data = np.array([[1,2,3],
[4,5,6]])
# Expected result
np.array([[f1(1),f2(2),f3(3)],
[f1(4),f2(5),f3(6)]])
编辑
下面是预期行为的更好示例。能够广播很重要,就像对两个数组求和一样:
>>> np.array([0,1]) + 1
np.array([0+1, 1+1])
>>> np.array([0,1]) + np.array([1,2])
np.array([0+1, 1+2])
>>> np.array([0,1]) + np.array([[1,2], [3,4]])
np.array([[0+1, 1+2], [0+3, 1+4]])
## Expected behaviour (Imagine % means function application operator)
>>> np.array([0,1]) % f
np.array([f(0), f(1)])
>>> np.array([0,1]) % np.array([f1,f2])
np.array([f1(0), f2(1)])
>>> np.array([0,1]) % np.array([[f1,f2], [f3,f4]])
np.array([[f1(0), f2(1)], [f3(0), f4(1)]])
解决方案
利用frompyfunc
f = np.frompyfunc(lambda fx,arg: fx(arg), 2, 1)
res = f(fns, arg)
结果应该是对象 dtype,具有完整的广播。
In [416]: f = np.frompyfunc(lambda fn,x:fn(x),2,1)
In [420]: f1=lambda x:x+1
...: f2=lambda x: x*3
In [421]: f([[f1],[f2]], np.arange(4))
Out[421]:
array([[1, 2, 3, 4],
[0, 3, 6, 9]], dtype=object)
推荐阅读
- c - 在 C 中指定用于“枚举”的位数(如果值不合适,则编译错误)
- matlab - 在散点图中按箭头键时数据光标不移动
- asp.net-core - 如何在 Azure Bot 中调用需要身份验证的 API?
- angular - 如何手动完成 angular http observable
- angular - 开始日期验证之前的结束日期在 Angular 项目中无法正常工作
- c# - 如何在 Unity3D 中使按钮的可选区域更小?
- sql - 如何查询一张表,并将结果作为两张表返回
- javascript - 如何阻止发布方法表单清除提交时的所有输入值?(HTML/JS)
- python - gc.collect() 函数究竟做了什么?
- google-cloud-pubsub - 在 pubsub 服务中处理 SIGTERM 和 SIGINT 信号的最佳方法是什么?