通过2D数组的内部和调用函数

时间:2013-07-26 04:06:36

标签: python arrays numpy vectorization

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

def f(a, b, arr):
    X = a * np.exp(-arr**2 / b)
    return np.sum(a * np.log(X) - arr)

我想要做的是为a和b的不同值评估f(),同时保持相同的arr:

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()将始终返回标量。

1 个答案:

答案 0 :(得分:2)

  1. 通过np.ix_()

  2. 从xaxis,yaxis,arr数据构建一个开放网格
  3. 使用np.sum()致电axis=-1

  4. 以下是代码:

    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)