我有一个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矩阵。
答案 0 :(得分:0)
要扩展我的评论并提供一些实际的代码,您可以通过一些数组重塑来使用现有的矩阵:
eigs = np.linalg.eigvals(s.swapaxes(0, -1).swapaxes(1,-2))
e = eigs.swapaxes(0,-1)
将为您提供
矩阵>>> e.shape()
(3, 256, 256, 256)