Python 二维数组上具有内部和的调用函数

Python 二维数组上具有内部和的调用函数,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,假设我有一个python函数f(),它接受2个标量和1个类似数组的参数: def f(a, b, arr): X = a * np.exp(-arr**2 / b) return np.sum(a * np.log(X) - arr) 我想做的是在保持相同arr的情况下,对a和b的不同值计算f() XX, YY = np.meshgrid(A_axis, B_axis) arr = np.arange(10) ZZ = np.empty_like(XX) for i in ra

假设我有一个python函数f(),它接受2个标量和1个类似数组的参数:

def f(a, b, arr):
    X = a * np.exp(-arr**2 / b)
    return np.sum(a * np.log(X) - arr)
我想做的是在保持相同arr的情况下,对a和b的不同值计算f()

XX, YY = np.meshgrid(A_axis, B_axis)
arr = np.arange(10)
ZZ = np.empty_like(XX)
for i in range(XX.shape[0]):
    for j in range(YY.shape[1]):
        ZZ[i,j] = f(XX[i,j], YY[i,j], arr)
有没有办法将其矢量化?我正在考虑将XX、YY和arr转换为相同形状的3D数组,但f()中的np.sum()将始终返回标量

  • 通过
    np.ix_389;()

  • 使用轴=-1调用
    np.sum()

  • 代码如下:

    import numpy as np
    
    ### original code
    def f(a, b, arr):
        X = a * np.exp(-arr**2 / b)
        return np.sum(a * np.log(X) - arr)
    
    A_axis = np.linspace(1, 5, 8)
    B_axis = np.linspace(1, 2, 9)
    XX, YY = np.meshgrid(A_axis, B_axis)
    arr = np.arange(10)
    ZZ = np.empty_like(XX)
    for i in range(XX.shape[0]):
        for j in range(YY.shape[1]):
            ZZ[i,j] = f(XX[i,j], YY[i,j], arr)
    
    ### use broadcast        
    def f(a, b, arr):
        X = a * np.exp(-arr**2 / b)
        return np.sum(a * np.log(X) - arr, axis=-1)
    B, A, C = np.ix_(B_axis, A_axis, arr)
    result = f(A, B, C)
    
    print np.allclose(ZZ, result)
    

    那么它有效吗?你只是想把它矢量化?你是真函数吗?如果是这样的话,它将简化为一个*log(a)-arr*(1-(a/(2*b))。@tom10不,它不是真正的函数:)@Stephan是的,我只想矢量化它有一种不修改f()的方法吗?如果有两个类似数组的参数呢?