每个网格点处矩阵的特征值

时间:2017-03-07 17:25:36

标签: python numpy matrix linear-algebra lapack

我有一个3d网格。在每个网格点,我有一个矩阵。我想使用python在每个网格点找到该矩阵的特征值和特征向量。我正在做这样的事情。

import numpy as np
from numpy import linalg as LA
n = 256
s = np.zeros((3,3,n,n,n))
#s is calculated by a formula here, this part is correct
e = np.zeros((3,n,n,n))
e[0:3,:,:,:] = LA.eigvals(s[0:3,0:3,:,:,:])

它出现以下错误,

1 n = 256
2 e = np.zeros(((3),n,n,n))
----> 3 e[0:3,:,:,:] = LA.eigvals(s[0:3,0:3,:,:,:])

ValueError: could not broadcast input array from shape (3,3,256,256) into shape (3,256,256,256)

由于它是一个大型数组,因此使用循环需要花费大量时间。我实际上必须为许多这样的立方网格做这件事。有没有办法避免循环?代码必须理解在每个网格点,有一个需要特征值的矩阵,它不是一个5交叉5矩阵。

1 个答案:

答案 0 :(得分:0)

要扩展我的评论并提供一些实际的代码,您可以通过一些数组重塑来使用现有的矩阵:

eigs = np.linalg.eigvals(s.swapaxes(0, -1).swapaxes(1,-2))
e = eigs.swapaxes(0,-1)

将为您提供

矩阵
>>> e.shape()
(3, 256, 256, 256)