Чтение матрицы из файла

У меня есть текстовый файл, состоящий из нескольких чисел с пробелом, и я хочу сделать его тремя матрицами 4 * 4 в python. Каждая матрица также разделена двумя символами в текстовом файле. Формат txt файла такой:

1 1
0 0 0 0
0 0 0 0
0 0 0 0 
0 0 0 0
1 1
0 0 0 0
0 0 0 0
0 0 0 0 
0 0 0 0
1 1
0 0 0 0
0 0 0 0 
0 0 0 0
0 0 0 0

Мой код теперь такой, но он не показывает результат, который я хочу.

file = open('inputs.txt','r')
a=[]
for line in file.readlines():
    a.append( [ int (x) for x in line.split('1 1') ] )

Вы можете помочь мне с этим?

Что означают линии с 1 1, разделяют ли они матрицы?

gsan 15.05.2022 22:33

Формат вывода должен быть массивом из трех 4 * 4 (матриц) с использованием numpy. 1 1 – разделение матриц

Jase 15.05.2022 22:48

вам следует прочитать все - read(), а затем разделить его с помощью split('1 1'), чтобы создать 4 строки с матрицами. А позже вам придется разделить эти строки, используя "\n" и space.

furas 15.05.2022 22:52

возможно, сначала используйте print(), чтобы увидеть, что вы получаете в line, line.split('1 1') и x (прежде чем использовать int(). Он называется "print debuging", и он помогает увидеть, что делает код.

furas 15.05.2022 22:53

Сохранение всего файла в памяти не рекомендуется. Это могут быть терабайты...

Necklondon 15.05.2022 22:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
40
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из вариантов — использовать groupby:

from itertools import groupby

matrices = []

with open('inputs.txt', 'r') as f:
    for separator, lines in groupby(f, lambda line: line.strip() == '1 1'):
        if not separator:
            matrices.append([[int(x) for x in line.split()] for line in lines])

print(matrices)
# [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
#  [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
#  [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]

Как я могу сделать три матрицы 4 * 4? Например, запись первой строки в матрице 4 * 4? Я хочу, чтобы они отображались не прямо друг к другу, а как 4 разные строки друг под другом

Jase 15.05.2022 23:00
Ответ принят как подходящий

Старый добрый чистый алгоритм Python (при условии, что матрицы могут содержать строковые значения, в противном случае конвертировать по мере необходимости):

file = open("inputs.txt",'r')
matrices=[]
m=[]
for line in file:
   if line= = "1 1\n": 
      if len(m)>0: matrices.append(m)
      m=[]
   else:
      m.append(line.strip().split(' '))
if len(m)>0: matrices.append(m)
print(matrices)
# [[['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0']], 
#  [['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0']], 
#  [['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0']]]

Как я могу сделать три матрицы 4 * 4? Например, запись первой строки в матрице 4 * 4? Я хочу, чтобы они отображались не прямо друг к другу, а как 4 разные строки друг под другом

Jase 15.05.2022 23:02

В питоне нет таких вещей, как матрицы. Только списки. Возможно, вы захотите взглянуть на numpy для примеров, но я точно не знаю, что вам нужно. Кстати, вывод на экран не зависит от хранения в памяти.

Necklondon 15.05.2022 23:08

Предполагая, что ваш файл не огромен, он числовой и имеет размер 4x4, самый простой способ:

  • прочитать весь файл
  • разделите его на блоки с помощью разделителя 1 1\n
  • отбросить элементы-разделители (if block)
  • преобразовать блок в вектор с помощью split
  • изменить форму каждого вектора на 4x4
  • сделать его целым

В одной строке: matrixes = [np.reshape(np.array(block.split()),(4,4)).astype(int) for block in open('inputs.txt').read().split('1 1\n') if block]

Предостережение: если матрица читает x x 1 1 в одной из своих строк, это будет считаться разделением в любом случае. Использование значения, которое можно было бы использовать в матрице, не является хорошей идеей.

Это может предотвратить разделение на \n1 1\n и удаление первых 4 символов вручную (1 1\n). Также эта реализация может быть более эффективной, сглаживая все, а затем изменяя форму:

dd = open('inputs.txt').read()[4:]
nmats = dd.count('\n1 1\n') +1
matrixes = np.reshape(np.array(dd.replace('\n1 1\n',' ').split()).astype(int),(nmats,4,4))

Этот последний вариант возвращает его как единую 3D-матрицу:

>>> matrixes
array([[[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]],

       [[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]],

       [[0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]]])
>>> matrixes[0]
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

Другие вопросы по теме

Как добавить постоянное значение к оси 1 (только) массива 2d numpy?
Pandas foward заполняет между ними - те же значения
Список элементов массива numpy - ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()
Манипулирование данными Pandas из столбца в элементы строки
Как отсортировать трехмерный замаскированный массив numpy по оси времени в каждой сетке, то есть на определенной широте и долготе для набора климатических данных
Как совместить зимние месяцы, которые охватывают 2 года?
Использование функции numpy.where с несколькими условиями, но получение valueError
Работа с мультииндексным фреймом данных для получения результатов суммирования по логическому столбцу на основе условия из другого столбца
Как правильно вычислить градиент кривой, используя градиент numpy?
Как понять неточные результаты при использовании np.log?