Python Как создать 4 на 4 матрицы, используя текстовый файл - PullRequest
0 голосов
/ 18 марта 2020

Итак, у меня есть файл "txt", и я хочу создать 4 на 4 матрицы с ним. Мне нужно отделить их от каждого "4 4". Как мне это сделать? Файл "input.txt" содержит это:

4 4
55 55 55 56
66 66 66 67
77 77 77 78
88 88 88 89
4 4
1 2 3 4
2 2 2 2
3 3 3 3
4 4 4 4
4 4
11 12 13 14
22 24 24 25
33 34 35 36
44 45 46 47

Как я уже сказал, мне нужно сделать отдельные матрицы, и каждая матрица заканчивается на "4 4". Как я могу отделить их оттуда? Я пытался использовать некоторые методы, но не мог сделать это до сих пор. Спасибо, что потратили время на чтение этого вопроса. Я попробовал это:

[i.lower().replace('4 4', '').split() for i in open('input.txt', 'r')]

Вывод такой:

[[],
 ['55', '55', '55', '56'],
 ['66', '66', '66', '67'],
 ['77', '77', '77', '78'],
 ['88', '88', '88', '89'],
 [],
 ['1', '2', '3', '4'],
 ['2', '2', '2', '2'],
 ['3', '3', '3', '3'],
 [],
 [],
 ['11', '12', '13', '14'],
 ['22', '24', '24', '25'],
 ['33', '34', '35', '36'],
 ['45', '46', '47']]

Как видите, это не совсем то, что я хотят.

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Просто еще один пример:

f = open('untitled.txt', 'r').read().splitlines()

# filter the '4 4' elements, and split on space
s = list(map(str.split, filter(lambda x: x != '4 4', f)))

# turn the list in to a list of matrices
m = [np.array(s[i:i+4]) for i in range(0, len(s), 4)]
2 голосов
/ 18 марта 2020

Вы можете начать с удаления этих строк, которые вас беспокоят:

>>> lines = [line for line in text_file.splitlines() if line != "4 4"]

Затем создайте матрицы с каждым чанком 4 последовательных строки:

>>> [np.fromstring("\n".join(lines[x:x+4]), sep=" ", dtype=int).reshape(4,4) 
     for x in range(0, len(lines), 4)]

Какой вывод представляет собой список матриц размер (4, 4):

[array([[55, 55, 55, 56],
       [66, 66, 66, 67],
       [77, 77, 77, 78],
       [88, 88, 88, 89]]), 

 array([[1, 2, 3, 4],
       [2, 2, 2, 2],
       [3, 3, 3, 3],
       [4, 4, 4, 4]]), 

 array([[11, 12, 13, 14],
       [22, 24, 24, 25],
       [33, 34, 35, 36],
       [44, 45, 46, 47]])]
1 голос
/ 19 марта 2020

Это немного чрезмерно, но я учусь, поэтому я хотел бы использовать этот вопрос, чтобы опубликовать решение с использованием Context Manager. (Это означает, что вы можете использовать with, я приведу пример):

import numpy as np

class MyMatrixFile(object):
    def __init__(self, filename, mode):
        self.__filename = filename
        self.__mode = mode

    def __enter__(self):
        self.__open_file = open(self.__filename, self.__mode)
        self.__deserialise()
        return self.__myMatrixList

    def __exit__(self, *args):
        self.__open_file.close()

    def __deserialise(self):
        data = self.__open_file.read().splitlines()
        temp = list(map(str.split, filter(lambda x: x != '4 4', data)))
        self.__myMatrixList = [np.array(temp[i:i+4]) for i in range(0, len(temp), 4)]

Если у вас есть вышеупомянутый класс в вашем файле python, вы можете открыть его типы файлов с помощью следующего:

with MyMatrixFile('test_matrix_file.txt', 'r') as matrix_list:
    # do stuff

Где matrix_list - ваш список numpy.array объектов. Такое использование означает, что код, обрабатывающий файл, помещается в класс (эффективно скрытый). Кроме того, файл закроется, как только вы выйдете из отступа with.

Это будет особенно полезно, если вам нужно обработать много файлов этого типа!

...