2017-07-03 3 views
1

J'ai un fichier texte avec des nombres imaginaires en utilisant i que je veux importer en Python. Le fichier texte a été sauvegardé à partir de MATLAB qui utilise i pour les nombres imaginaires et Python utilise j pour les nombres imaginaires. Cela provoque des erreurs lors de l'importation du fichier.Importer un fichier texte avec i pour les nombres imaginaires en Python

a = np.loadtxt('a.txt') 

Voici un exemple de quelques lignes dans le fichier texte:

282814803.000000 + 0.00000000000000i 
-16531486.2042027 + 10391991.8573661i 
6013078.93662147 - 7538432.00418058i 
+0

C'est un problème commun ceci (complexe en python). Voulez-vous charger le fichier a.txt dans une liste python ou un tableau numpy. J'ai posté un aswer pour le "cas de tableau numpy" – sera

Répondre

1

Un, moyen rapide et sale serait de faire ce qui suit:

values = list() 
with open('a.txt') as h: 
    for line in h: 
     values.append(eval(line.replace('i', 'j'))) 

# OUTPUT 
# print values 
# [(282814803+0j), (-16531486.2042027+10391991.8573661j), (6013078.93662147-7538432.00418058j)] 
0

ici un exemple pour une ligne:

>>> line="282814803.000000 + 163486.00000000000000i" 
>>> line=line.replace('i', 'j') 
>>> line=line.replace(' ', '') 
>>> complex(line) 
(282814803+163486j) 

Puis vous pouvez faire:

list=[] 
with open('data.txt') as data: 
    for line in data: 
     line=line.replace('i', 'j') 
     line=lim]ne.replace(' ', '') 
     list.append(complex(line)) 

qui vous donnera:

>>>list 
[(282814803+163486.00468j), (-16531486.2042027+10391991.8573661j), (6013078.93662147-7538432.00418058j)] 
-1

Une solution possible est la suivante mais vous devez prétraiter le fichier txt premier.

Si vous ouvrez le fichier txt et remplacer (egCTRL + H sur les fenêtres) tous les symboles + avec seulement [espace] et tout ce que je avec [espace], vous aurez quelque chose comme:

282814803,0 0,00

-16531486,2 10391991,85

6013078,9 7538432,00

Ensuite, vous pouvez utiliser:

import numpy 
a = np.loadtxt('a.txt').view(complex) 
print(a) 

Les résultats sont:

>>> a 
array([[ 2.82814803e+08  +0.j  ], 
     [ 1.65314862e+07+10391991.8573661j ], 
     [ 6.01307894e+06 +7538432.00418058j]]) 

Peut-être que ce n'est pas la meilleure façon, mais il fonctionne bien et il vous donne un tableau numpy pas une liste!