在Python中从.txt文件创建方阵

时间:2019-10-20 19:44:14

标签: python arrays list matrix text-files

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

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

URL以查看.txt文件中的概念和数据布局:

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

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

2 个答案:

答案 0 :(得分: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']

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

答案 1 :(得分:1)

您可以使用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]]