Tengo un archivo que contiene las siguientes cadenas:

 1    40.870     0.710  570  363
0.00000E+00
 2    40.960     0.870  575  367
0.00000E+00
 3    41.210     0.980  578  378
0.00000E+00

Y necesito convertirlo en una matriz así:

     40.870     0.710  0.000
     40.960     0.870  0.000
     41.210     0.980  0.000

Cualquier ayuda sería muy apreciada

0
Vanessa 10 dic. 2015 a las 16:59

4 respuestas

La mejor respuesta
def rows(data):
    while True:             
        a = next(data).split()
        b = next(data).split()
        yield float(a[1]), float(a[2]), float(b[0])

list(rows(open("somefile.txt")))
[(40.87, 0.71, 0.0), (40.96, 0.87, 0.0), (41.21, 0.98, 0.0)]

numpy.array(list(rows(open("somefile.txt"))))
array([[ 40.87,   0.71,   0.  ],
       [ 40.96,   0.87,   0.  ],
       [ 41.21,   0.98,   0.  ]])

PD No tengo idea de cuáles fueron esos campos 570 y 363 que fueron ignorados ...

1
Dima Tisnek 10 dic. 2015 a las 14:08

Muchas gracias a todos, finalmente encontré otra solución:

c = 0
f = open(fich_interp_out, 'w')
for i in open(fich_interp, 'r'):
    if c<3:
        pass

    elif c%2 != 0:

        s = i[:-1]
    else:
        s += i
        f.write(s)

    c+=1
0
Vanessa 15 dic. 2015 a las 09:10

Puede leer su archivo con read_table del paquete pandas. Luego, configúrelo para usar las columnas que necesita, y luego obtenga los valores de esos marcos de datos con el método values que devuelve una matriz numpy:

import pandas as pd
df = pd.read_table(file, sep='\s+', header=False)

In [157]: df
Out[157]: 
   0      1     2    3    4  5
0  1  40.87  0.71  570  363  0
1  2  40.96  0.87  575  367  0
2  3  41.21  0.98  578  378  0


mat = df[[1,2,5]].values

In [160]: mat
Out[160]: 
array([[ 40.87,   0.71,   0.  ],
       [ 40.96,   0.87,   0.  ],
       [ 41.21,   0.98,   0.  ]])
0
Anton Protopopov 10 dic. 2015 a las 17:52
import pandas as pd
take_cols = [1,2,5]
mat = pd.read_table(in_file,sep="\t",usecols=take_cols)
1
soungalo 10 dic. 2015 a las 14:14
34203797