在 Python 中向量化标量数组乘法 (Numpy)

Vectorizing scalar-array multiplication in Python (Numpy)

我创建了一个 2D 网格 w = np.meshgrid(x,y),我正在尝试将其输入到以下函数中:

def f(w):
    eigs = np.linalg.eigvals(A0 + w[0]*A1 + w[1]*A2)
    return abs(eigs[0] - eigs[-1])

其中 A0、A1、A2 是方阵。但是我收到一个错误,告诉我操作数不能一起广播。基本上发生的事情是 w[0]*A1 没有矢量化,所以 w[0] 是网格的整个 x 值块而不是每个单独的 x 值,对于 w[1]*A2 也是一样,但是y 值。

我试过 np.vectorize(func) 但那不起作用,我得到一个 IndexError。

由于 w[0] 是一个 (n,m) 数组,您可以 'vectorize' 通过

def f(w):
    eigs = np.linalg.eigvals(A0+w[0][...,None,None]*A1 +
        w[1[...,None,None]*A2)
    return abs(eigs[...,0] - eigs[...,-1]

结果与 w[0] 的形状相同。

这是有效的,因为内部函数在 xy 中是线性的,并且 eigvals 接受 (..., M, M) array_like 输入。在这种情况下,它的输入将是 (n,m,M,M) 形状。