从文件中读取矩阵

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]])