2016-10-31 3 views
1

Je suis en train de définir un tableau pour l'énergie totale (H) où la relation suivante est vraie:IndexError: trop d'indices pour tableau - Total énergie Matrice Variational Méthode

< i | H | j> = E_j < i | j> = E_j * S [i, j]

et S [i, j] est l'élément correspondant de la matrice de chevauchement. J'ai la matrice E_j et je suis en train d'obtenir la matrice H comme suit:

H = np.zeros([M]) 
for n in range (M): 
    for m in range(M): 
     H[n,m]= E[n]*S[n,m] 
print ("H = ") 
np.savetxt(sys.stdout, H, fmt= '%7.4f') 

Cela me donne le message d'erreur: « IndexError: trop d'indices pour tableau »

que je suis considéré quelque chose à voir avec le fait que j'ai essayé de multiplier un tableau unidimensionnel par un tableau bidimensionnel. Pas vraiment sûr s'il y a une solution de contournement pour cela mais toute aide est appréciée.

Merci!

+1

L'initialisation ne devrait-elle pas être 'H = np.zeros ([M, M])' à la place? – Divakar

+0

@Divakar Oh oui vous avez raison! Merci d'avoir signalé mon erreur idiote – XBB

Répondre

0

Si vous travaillez avec des tableaux NumPy, je suggère de regarder dans des méthodes vectorisées pour améliorer les performances. Dans votre cas, vous pouvez convertir E en 2D en introduisant une dimension singleton comme deuxième avec numpy.newaxis/None, puis effectuer la multiplication par éléments avec S. Ceci amènerait broadcasting, ce qui sous le capot reproduirait tous les éléments de E à la forme de S, ce qui est une opération très efficace et par la suite multiplierait par S.

Ainsi, nous aurions une seule ligne pour obtenir H, comme si -

H = E[:,None]*S 

On pourrait aussi utiliser np.einsum et cela pourrait sembler très proche de la forme loufoque originale avec itérateurs mué sous forme de chaînes , comme si -

H = np.einsum('n,nm->nm',E,S) 
+0

c'est plutôt joli merci! – XBB

0

L'initialisation de la matrice H était incorrecte. Devrait être comme suit:

H = np.zeros([M,M]) 
for n in range (M): 
    for m in range(M): 
     H[n,m]= E[n]*S[n,m] 
print ("H = ") 
np.savetxt(sys.stdout, H, fmt= '%7.4f')