Tengo un archivo muy grande (~ 20 GB) del que quiero leer líneas específicas que representan una matriz. El archivo de datos para tres matrices de 2 x 2 se ve así:

2 3
1 3
2 2
1 2
3 2
3 4

Actualmente estoy usando el siguiente enfoque (de aquí) donde obtengo una lista de cadenas.

import itertools
import matplotlib.pyplot as plt

n = 2 # matrix size
t = 3 # number of matrices
file = open("data")
t = 0;
with file as f:
    while t < 3:
        t=t+1
        next_n_lines = list(islice(f, n))
        print(next_n_lines)
        plt.matshow(next_n_lines)
        plt.show()
        if not next_n_lines:
            break
        # process next_n_lines

Pero, ¿cómo obtengo flotantes en lugar de una lista de cadenas? No lo veo, pero no puede ser tan difícil.

0
random9 30 oct. 2017 a las 11:30

3 respuestas

La mejor respuesta

Solución extendida:

import matplotlib.pyplot as plt, itertools

n = 2
num_m = 3
with open('data', 'r') as f:
    for i in range(num_m):
        try:
            items = [list(map(float, i.split())) for i in itertools.islice(f, n)]
        except:
            raise
        else:
            plt.matshow(items)
            plt.show()

La salida:

enter image description here enter image description here enter image description here

1
RomanPerekhrest 30 oct. 2017 a las 09:33

Simplemente .split las líneas y mapee la función float en los resultados, usando listas de comprensión aquí, pero lo que quiera:

In [29]: from itertools import *
    ...: n = 2 # matrix size
    ...: t = 3 # number of matrices
    ...: with open('data') as f:
    ...:     for _ in range(t):
    ...:         s = islice(f, n)
    ...:         M = [[float(x) for x in line.split()] for line in s]
    ...:         print(M)
    ...:
[[2.0, 3.0], [1.0, 3.0]]
[[2.0, 2.0], [1.0, 2.0]]
[[3.0, 2.0], [3.0, 4.0]]

También tenga en cuenta que es mucho más limpio usar un bucle for en lugar de un bucle while.

2
juanpa.arrivillaga 30 oct. 2017 a las 08:38

NumPy's fromfile puede ser útil aquí:

import numpy as np

n = 2 # matrix size
t = 3 # number of matrices

with open('data') as fobj:
    for _ in range(t):
        try:
            numbers = np.fromfile(fobj, count=n * n, sep=' ').reshape(n, n)
            plt.matshow(numbers)
            plt.show()
        except ValueError:
            break

Produce la salida deseada:

enter image description here enter image description here enter image description here

1
Mike Müller 30 oct. 2017 a las 13:49