2017-03-07 24 views
1

我有一個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交叉矩陣。

+0

' LA.eigvals'接受一個形狀爲'(...,M,M)'的矩陣,其中最後的兩個維度是計算特徵值的座標軸(參見[docs](https://docs.scipy。組織/ DOC/numpy的/參照/生成/ numpy.linalg.eigvals.html#numpy.linalg.eigvals))。在這種情況下,不要擔心預分配'e',這是錯誤來自哪裏。每個網格點的矩陣大小是多少? 3x3的?如果是這樣,你會希望''矩陣的形狀(n,n,n,3,3)。 – pstjohn

+0

@pstjohn:是的,它在每個點上是3個交叉3矩陣。我會嘗試你的解決方案,並回來。 –

回答

0

爲了擴大對我的評論,並提供一些實際的代碼,你可以得到這個與您現有的矩陣工作,與一些陣列重塑:

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

會給你一個矩陣

>>> e.shape() 
(3, 256, 256, 256) 
+0

完美。我能夠在網格點計算特徵值和特徵向量。按順序排列特徵值也很好,但是在特徵vecs方面有問題。你可以檢查:'a = np.zeros((3,3,2,2,2))a [:,:,0,0,0] = [[5,0,0],[0,1 ,0],[0,0,3]] a [:,:,1,1,1] = [[2,0,0],[0,3,0],[0,0,1]] (0,-1).swapaxes(1,-2))ev = eigvals.swapaxes(0,-1)evecs = eigvecs.swapaxes(0,-1).swapaxes (1,-2)evo = np.sort(ev,axis = 0)eveco = evecs [np.argsort(ev,axis = 0),:] print np.shape(eveco)'It gives(3,2, 1,2,3,2,2,2)而不是(3,3,2,2,2) –