在 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]
的形状相同。
这是有效的,因为内部函数在 x
和 y
中是线性的,并且 eigvals
接受 (..., M, M) array_like
输入。在这种情况下,它的输入将是 (n,m,M,M)
形状。
我创建了一个 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]
的形状相同。
这是有效的,因为内部函数在 x
和 y
中是线性的,并且 eigvals
接受 (..., M, M) array_like
输入。在这种情况下,它的输入将是 (n,m,M,M)
形状。