从文件中读取矩阵
Reading Matrix from file
我有一个 txt 文件,其中包含一些带有 space 的数字,我想将其制作成 python 中的三个 4*4 矩阵。每个矩阵在文本文件中也用两个符号划分。 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') ] )
你能帮我吗?
一种选择是使用 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]]]
一个很好的老纯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']]]
假设您的文件不是很大,它是数字和 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))
最后一个选项returns它作为单个 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]])
我有一个 txt 文件,其中包含一些带有 space 的数字,我想将其制作成 python 中的三个 4*4 矩阵。每个矩阵在文本文件中也用两个符号划分。 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') ] )
你能帮我吗?
一种选择是使用 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]]]
一个很好的老纯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']]]
假设您的文件不是很大,它是数字和 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))
最后一个选项returns它作为单个 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]])