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.
' 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
@pstjohn: oui, il y a 3 matrice de croix 3 à chaque point. Je voudrais essayer votre solution et revenir. –