Заполнить массивы в Python (NumPy)? - PullRequest
3 голосов
/ 27 мая 2011

Имеется файл в следующем формате:

a a 0
a b 1
a c 1
b b 0
b a 1
b c 1
c c 0
c a 1
c b 1

Третий столбец - это расстояние между элементами в первом и втором столбцах.Если я прочитал такой файл в pyton как вложенный список, как мне преобразовать его в симметричную матрицу, например,

  a b c
a 0 1 1
b 1 0 1
b 1 1 0

?Я также хотел бы включить имена столбцов и строк.

Я бы хотел использовать numpy для выполнения этой задачи.

Есть предложения?

Спасибо, Д.

Ответы [ 2 ]

4 голосов
/ 27 мая 2011
import numpy as np
from itertools import count

data = [line.split() for line in inputfile.readlines()]
rows = dict(zip(sorted(set(line[0] for line in data)), count()))
cols = dict(zip(sorted(set(line[1] for line in data)), count()))
array = np.zeros((len(rows), len(cols)))

for row, col, val in data:
    index = (rows[row], cols[col])
    array[index] = val

Я не знаю, как пометить строки и столбцы в numpy, поэтому я просто сделал dict, отображающий метку строки в индекс строки, а другой сделал то же самое для столбцов. Если вам это нужно, вы можете сделать обратную карту, как показано ниже, или вы можете сделать строки и столбцы bidict .

rows_reverse = dict((v, k) for k, v in rows)
cols_reverse = dict((v, k) for k, v in cols)
2 голосов
/ 30 мая 2011

Немного другой подход:

import numpy as np
# Load "Row Col Value" text file
ar = np.loadtxt('file.txt', [('R','|S1'), ('C','|S1'), ('V','i')])
names = np.unique(np.row_stack((ar['R'], ar['C']))).tolist()
vf = np.vectorize(lambda x: names.index(x), otypes='i')
# load them in an output array
out = np.empty((len(names), len(names)), 'i')
out[vf(ar['R']), vf(ar['C'])] = ar['V']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...