2017-03-07 1 views
1

J'ai une grille 3D. À chaque point de la grille, j'ai une matrice. Je voudrais trouver des valeurs propres et des vecteurs propres de cette matrice à chaque point de la grille en utilisant python. Je fais quelque chose comme ça.Valeurs propres pour la matrice à chaque point de la grille

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,:,:,:]) 

Il donne suite à une erreur,

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) 

Comme il est un grand tableau, en utilisant des boucles prend beaucoup de temps. Je dois le faire pour de nombreux réseaux cubiques. Y a-t-il un moyen d'éviter les boucles? Le code doit comprendre que sur chaque point de la grille, il y a une matrice dont les valeurs propres sont nécessaires, ce n'est pas une matrice de 5 croix 5.

+0

' LA.eigvals' accepte une matrice de forme '(..., M, M)', où les deux dernières dimensions sont les axes sur lesquels les valeurs propres sont calculées (voir [docs] (https: //docs.scipy. org/doc/numpy/reference/généré/numpy.linalg.eigvals.html # numpy.linalg.eigvals)). Ne vous inquiétez pas de pré-allouer 'e' dans ce cas, d'où vient l'erreur. Quelle est la taille de la matrice à chaque point de la grille? 3x3? Si c'est le cas, vous voulez que la matrice 's' soit dans la forme (n, n, n, 3,3). – pstjohn

+0

@pstjohn: oui, il y a 3 matrice de croix 3 à chaque point. Je voudrais essayer votre solution et revenir. –

Répondre

0

développiez mes commentaires et offrent un code réel, vous pouvez obtenir ce travail avec vos matrices existantes avec une gamme remodelant:

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

vous donnera une matrice avec

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

Parfait. Je suis capable de calculer des valeurs propres et des vecteurs propres à des points de roc. Tri des valeurs propres dans l'ordre est également bien, mais ayant des problèmes avec les vecs propres. Pouvez-vous vérifier: '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]] eigvals, eigvecs = LA.eig (a.swapaxes (0, -1) .swapaxes (1, -2)) ev = eigvals.swapaxes (0, -1) evecs = eigvecs.swapaxes (0, -1) .swapaxes (1, -2) evo = np.sort (ev, axe = 0) eveco = evecs [np.argsort (ev, axe = 0) ,:] print np.shape (eveco) 'Il donne (3, 2, 2, 2, 3, 2, 2, 2) au lieu de (3,3,2,2,2) –