【问题标题】:applying array of function to array of elements by position按位置将函数数组应用于元素数组
【发布时间】:2019-04-22 02:49:48
【问题描述】:

假设如下:

def x2(x):
    res=x*x
    return res

def tx(x):
    res=2*x
    return res

def x3(x):
    res=x*x*x
    return res

x=np.array([1,2,3])
f=np.array([x2,tx,x3])

我试图在不使用 for 循环的情况下返回一个 array([x2(1),tx(2),x3(3)]) 数组。 这在python中可能吗?

【问题讨论】:

    标签: python arrays numpy functional-programming numpy-ndarray


    【解决方案1】:

    没有客观理由这样做,但你可以这样做:

    @np.vectorize
    def apply(f,x) : return  f(x)
    

    那么apply(f,x) 现在是[1,4,27]

    【讨论】:

    • 为什么没有理由这样做?
    • 因为没有加速。当您在大型对齐数组上进行相同的计算时,numpy 是有效的。如果您每次都更改功能,您将一无所获。
    • 注意np.vectorize只是一个Python级别的循环,它的使用只是为了方便。
    【解决方案2】:

    不,在一般情况下,Python 级别的for 循环是不可避免的。

    但是你可以把它隐藏在map + lambda后面:

    res1 = list(map(lambda x: x[0](x[1]), zip((x2, tx, x3), x)))
    res2 = np.array([x2(1), tx(2), x3(3)])
    
    assert np.array_equal(res1, res2)
    

    当然,在这种情况下建议使用列表推导:

    res = [func(var) for func, var in zip((x2, tx, x3), x)]
    

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多