我有一个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矩阵。
为了扩展我的评论并提供一些实际的代码,您可以将其与现有矩阵一起使用,并进行一些重塑:
eigs = np.linalg.eigvals(s.swapaxes(0, -1).swapaxes(1,-2))
e = eigs.swapaxes(0,-1)
将为您提供
的矩阵>>> e.shape()
(3, 256, 256, 256)