获取许多一维数组特征值的最快方法

时间:2018-08-23 10:49:27

标签: python numpy vectorization eigenvalue abaqus

我有一个(n,m,6)数组,其中n和m大于10.000。这6个值来自对称矩阵,顺序如下:

[[[11,12,13],[12,22,23],[13,23,33]] =>(11,22,33,12,23,31)

我想计算每个矩阵的特征值和特征向量。现在,它通过2个for循环迭代每个维度,将值重新排序为矩阵形式并计算特征值来实现。但是我想知道是否存在使用矢量化的更快解决方案?

1 个答案:

答案 0 :(得分:3)

我发现最好的方法是使用(6,3,3)变换矩阵将对称值转换为适当的对称张量。

transf = np.array([[[1.,0.,0.],[0.,0.,0.],[0.,0.,0.]],                #11
                   [[0.,0.,0.],[0.,1.,0.],[0.,0.,0.]],                #22
                   [[0.,0.,0.],[0.,0.,0.],[0.,0.,1.]],                #33
                   [[0.,1.,0.],[1.,0.,0.],[0.,0.,0.]],                #12 & 21
                   [[0.,0.,1.],[0.,0.,0.],[1.,0.,0.]],                #13 & 31
                   [[0.,0.,0.],[0.,0.,1.],[0.,1.,0.]]]).swapaxes(0,1) #23 & 32

e, v = np.linalg.eigh(input.dot(transf))

非编程注:请注意abaqus是输出实际应力/应变还是工程应力/应变,因为结果转换是不同的(如果我正确记住“真实应变”,则需要关闭) -对角项为0.5而不是1.