【问题标题】:Creating a square matrix from a .txt file in Python在 Python 中从 .txt 文件创建方阵
【发布时间】:2020-02-16 23:23:14
【问题描述】:

我即将为 TSP(对称)问题创建一个运行哈密顿循环的程序,这意味着一条路径只到达一个点,然后走得更远。这些点之间的距离可以写成方阵。因为问题是对称的,所以我只有这个矩阵的一半作为.txt文件

我需要创建一个程序,该程序允许我将 .txt 文件中以空格分隔的值插入到数组中,并从中创建一个对称的方阵。

在 .txt 文件中查看当前想法和数据布局的 URL:

https://imgur.com/4G3sXrp

我是 Python 新手,我不太了解如何在这个级别使用 IO。

我尝试过使用 numpy 函数:loadtxt 但对我不起作用,我收到一条错误消息,说我无法将字符串转换为浮点数

我也尝试过创建循环来分割文本并创建这个矩阵。

def createMatrix(rows):
    matrix= [[0 for col in range(int(rows[0]))] for row in range(int(rows[0]))]
    i = 0
    for w in rows[1:]:
        w = string.strip(w).split(' ')
        j = 0
        for dist in w:
            matrix[i][j] = int(dist)
            matrix[j][i] = int(dist)
            j+=1
        i+=1
 return matrix

我希望代码结果至少能以某种方式指导我应该做什么,但正如我所提到的,我是一个新手,我真的不知道如何开始解决这个特定问题。

【问题讨论】:

    标签: python arrays list matrix text-files


    【解决方案1】:

    在您链接到的图片中,显示了您希望矩阵的外观,最后一列有 12 两次。此外,在倒数第二列中,您得到了 19。嗯?此外,输入文本文件的最后两行/行都有五个数字。我猜最后一行应该有六个数字。

    数字具有不同位数的事实使得直观地验证一切是否正确变得更加困难。

    如果您有一个如下所示的文本文件(“stuff.txt”)(注意,前导零用于填充):

    00
    01 00
    02 03 00
    04 05 06 00
    07 08 09 10 00
    11 12 13 14 00
    

    还有代码:

    with open("stuff.txt", "r") as file:
        lines = list(map(str.split, file.read().splitlines()))
    
        missing_values = []
    
        for index in range(len(lines)):
            missing_values.append([line[index] for line in lines[index+1:]])
    
        matrix = [line + values for line, values in zip(lines, missing_values)]
    
        for row in matrix:
            print(row)
    

    输出:

    ['00', '01', '02', '04', '07', '11']
    ['01', '00', '03', '05', '08', '12']
    ['02', '03', '00', '06', '09', '13']
    ['04', '05', '06', '00', '10', '14']
    ['07', '08', '09', '10', '00', '00']
    ['11', '12', '13', '14', '00']
    

    矩阵不是正方形的,因为文本文件的最后两行有五个数字(最后一行应该有六个)。

    【讨论】:

    • 这正是我想要的!清除解决方案
    【解决方案2】:

    您可以使用np.tril_indices 填充最终方阵的下三角部分,然后使用M += M.T 填充其余部分(因为您的对角线为零):

    import numpy as np
    
    with open('/tmp/test.txt') as fh:
        data = np.fromstring(fh.read().replace('\n', ' '), dtype=int, sep=' ')
    
    n = int(np.sqrt(8*data.size + 1) - 1) // 2
    matrix = np.zeros((n, n), dtype=int)
    matrix[np.tril_indices(len(matrix))] = data
    matrix += matrix.T  # Only works if diagonal is zero.
    
    print(matrix)
    

    使用 OP 的示例数据进行测试:

    text = '''0
    1 0
    2 3 0
    4 5 6 0
    7 8 9 10 0
    11 12 13 14 15 0'''
    
    with open('/tmp/test.txt', 'w') as fh:
        fh.write(text)
    

    我们得到输出:

    [[ 0  1  2  4  7 11]
     [ 1  0  3  5  8 12]
     [ 2  3  0  6  9 13]
     [ 4  5  6  0 10 14]
     [ 7  8  9 10  0 15]
     [11 12 13 14 15  0]]
    

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多