使用 numpy 从多个矩阵创建 3x3 矩阵以进行特征值和特征向量计算是否有更快的方法?

Is there a faster way of creating 3x3 matrices from multiple matrices for eigenvalue and eigenvector calculations using numpy?

我正在尝试计算多个 3x3 矩阵的特征值和特征向量。我有 6 个(e11、e12、e13、e22、e23、e33)mxn 形状的矩阵,每个 3x3 矩阵都是使用这 6 个矩阵中的每个元素形成的。这 6 个矩阵中的元素数量以千计。现在我只是循环遍历这些矩阵并在每次通过时创建一个 3x3 矩阵并计算特征值和特征向量,计算时间将近 10 分钟。我知道一定有更好的方法。我不是 python 方面的专家,所以如果能帮助我加快代码速度,我们将不胜感激。

查看下面我的代码:

for i in range(0,m):
    for j in range(0,n):
        E = np.array([ [e11[i][j], e12[i][j], e13[i][j]],
                       [e12[i][j], e22[i][j], e23[i][j]],
                       [e13[i][j], e23[i][j], e33[i][j]] ])

        e_val, e_vec = np.linalg.eig(E)

如果我创建一组 (3,4) 个数组,我可以将它们与

In [149]: e11,e12,e22 = [np.ones((3,4))*i for i in range(1,4)]
In [150]: E1=np.stack((np.stack([e11,e12],-1), np.stack([e12,e22],-1)),-1)
In [151]: E1.shape
Out[151]: (3, 4, 2, 2)

可以传给eig产生:

In [153]: np.linalg.eig(E)[0].shape
Out[153]: (3, 4, 2)

我会让你概括到你的 (3,3) 案例

根据@hpaulj 的建议,我修改了我的代码如下,将我的计算时间从 10 分钟减少到 40 秒。

E = np.stack([
    np.stack([e11,e12,e13],-1),
    np.stack([e12,e22,e23],-1),
    np.stack([e13,e23,e33],-1)],-1)

e_val, e_vec = np.linalg.eig(E)

所以现在 e_vale_vec 分别具有所有特征值和特征向量。