У меня есть текстовый файл, состоящий из нескольких чисел с пробелом, и я хочу сделать его тремя матрицами 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') ] )
Вы можете помочь мне с этим?
Формат вывода должен быть массивом из трех 4 * 4 (матриц) с использованием numpy. 1 1 – разделение матриц
вам следует прочитать все - read()
, а затем разделить его с помощью split('1 1')
, чтобы создать 4 строки с матрицами. А позже вам придется разделить эти строки, используя "\n"
и space
.
возможно, сначала используйте print()
, чтобы увидеть, что вы получаете в line
, line.split('1 1')
и x
(прежде чем использовать int()
. Он называется "print debuging"
, и он помогает увидеть, что делает код.
Сохранение всего файла в памяти не рекомендуется. Это могут быть терабайты...
Один из вариантов — использовать 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 разные строки друг под другом
Старый добрый чистый алгоритм 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 разные строки друг под другом
В питоне нет таких вещей, как матрицы. Только списки. Возможно, вы захотите взглянуть на numpy для примеров, но я точно не знаю, что вам нужно. Кстати, вывод на экран не зависит от хранения в памяти.
Предполагая, что ваш файл не огромен, он числовой и имеет размер 4x4, самый простой способ:
1 1\n
if block
)split
В одной строке:
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 1
, разделяют ли они матрицы?