Создание квадратной матрицы из файла .txt в Python - PullRequest
0 голосов
/ 20 октября 2019

Я собираюсь создать программу, выполняющую гамильтонов цикл для задачи TSP (симметричной), которая означает, что путь идет только в одну точку, а затем идет дальше. Расстояние между этими точками можно записать в виде квадратной матрицы. Поскольку проблема симметрична, у меня есть только половина этой матрицы в виде файла .txt

Мне нужно создать программу, которая позволит мне вставлять значения, разделенные пробелами из файла .txt, в массив,и создайте из него симметричную квадратную матрицу.

URL, чтобы увидеть представление идеи и макета данных в файле .txt:

https://imgur.com/4G3sXrp

Я новичокв Python, и я не очень понимаю, как работать с IO на этом уровне.

Я пытался использовать функцию numpy: loadtxt, но у меня не получилось, я получил сообщение об ошибке, в котором говорится, что я не могу конвертироватьstring to float

Я также пытался сделать это, создав циклы, которые должны были разделить текст и создать эту матрицу.

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 ]

1 голос
/ 20 октября 2019

Вы можете использовать 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)

Тест на примере данных ОП:

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]]
1 голос
/ 20 октября 2019

На картинке, на которую вы ссылаетесь, показывающей, как вы хотите, чтобы матрица выглядела, последний столбец имеет 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']

Матрица не является квадратной, потому что две последние строки в вашем текстовом файле имеют пять чисел (где последняя строка должна иметь шесть).

...