首页 > 解决方案 > 将一组函数应用于另一个数组

问题描述

我有一个 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)]])

标签: pythonarraysnumpy

解决方案


利用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)

推荐阅读