Crear una matriz a partir de un archivo de texto – python

Me gustaría crear una matriz de un archivo de tres columnas. Estoy seguro de que es algo extremadamente fácil, pero no entiendo cómo debe hacerse. Por favor, sé amable, soy un principiante de python. Gracias

El formato de mi archivo de entrada

AA 5 AB 4 AC 3 BB 2 BC 1 CC 0 

Salida deseada – matriz completa

  ABC A 5 4 3 B 4 2 1 C 3 1 0 

O – media matriz

  ABC A 5 4 3 B 2 1 C 0 

Intenté esto, pero como dije, soy MUY nuevo en python y en la progtwigción.

 import numpy as np for line in file('test').readlines(): name1, name2, value = line.strip().split('\t') a = np.matrix([[name1], [name2], [value]]) print a 

SCRIPT DE TRABAJO – Uno de mis amigos también me ayudó, así que si alguien está interesado en un script más simple, aquí está. No es el más eficiente, pero funciona perfectamente.

 data = {} names = set([]) for line in file('test').readlines(): name1, name2, value = line.strip().split('\t') data[(name1, name2)] = value names.update([name1]) names = sorted(list(names)) print names print data output = open('out.txt', 'w') output.write("\t%s\n" % ("\t".join(names))) for nameA in names: output.write("%s" % nameA) for nameB in names: key = (nameA, nameB) if key in data: output.write("\t%s" % data[(nameA, nameB)]) else: output.write("\t") output.write("\n") output.close() 

Tratar:

 import pandas as pd import numpy as np raw = [] with open('test.txt','r') as f: for line in f: raw.append(line.split()) data = pd.DataFrame(raw,columns = ['row','column','value']) data_ind = data.set_index(['row','column']).unstack('column') np.array(data_ind.values,dtype=float)) 

Salida:

array([[ 5., 4., 3.], [ nan, 2., 1.], [ nan, nan, 0.]])

Aunque ya hay una respuesta aceptada, usa pandas. Una forma relativamente genérica de obtener el mismo efecto pero al no usar una biblioteca adicional es la siguiente: (se usa numpy porque OPpy numpy, sin embargo, puede lograr lo mismo con las listas)

 import string import numpy as np up = string.ascii_uppercase uppercase = list() for letter in up: uppercase.append(letter) file = open("a.txt") matrix = np.zeros((3, 3)) for line in file.readlines(): tmp = line.strip() tmp = tmp.split(" ") idx = uppercase.index(tmp[0]) idy = uppercase.index(tmp[1]) matrix[idx, idy] = tmp[2] 

La idea es que reúnas todas las letras alfabéticas, es de esperar que OP se limite solo al alfabeto inglés sin caracteres especiales (šđćžčę ° e etc …).

Creamos una lista del alfabeto para poder utilizar el método de index para recuperar el valor del índice. Es decir, uppercase.index("A") es 0 . Podemos usar estos índices para completar nuestra matriz.

Lea en el archivo línea por línea, elimine los caracteres adicionales, divida por espacio para obtener:

 ['A', 'A', '5'] ['A', 'B', '4'] 

Esta es ahora la parte de trabajo real:

  idx = uppercase.index(tmp[0]) idy = uppercase.index(tmp[1]) matrix[idx, idy] = tmp[2] 

Es decir, para la letra “A”, idx evalúa como 0 y también lo hace idy . Entonces la matrix[0,0] convierte en el valor tmp[2] que es 4 . Siguiendo la misma lógica para “B” obtenemos la matrix[0,1]=5 . Y así.

Un caso más generalizado sería declarar matrix = np.zeros((3, 3)) como matrix = np.zeros((26, 26)) porque hay 26 letras en el alfabeto inglés y el OP no solo tiene que use “ABC”, pero podría usar toda la gama AZ.

Ejemplo de salida para el progtwig superior sería:

 >>> matrix array([[ 5., 4., 3.], [ 0., 2., 1.], [ 0., 0., 0.]]) 

Puede usar esta biblioteca http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html

Solo necesitas hacer el ajuste adecuado.

Espero eso ayude.

Tu matriz parece recordar una matriz de adyacencia de un gráfico.

Encuentro la respuesta con pandas mucho más concisa y elegante. Aquí está mi bash sin agregar pandas como una dependencia adicional.

  f = open('.txt', 'r'); EdgeKey = namedtuple("EdgeKey", ["src", "dst"]) g = dict() for line in f: elems = line.split(' '); key = EdgeKey(src=elems[0], dst=elems[1]) g[key] = elems[2] key_rev = EdgeKey(src=elems[1], dst=elems[0]) # g[A, B] == g[B, A] g[key_rev] = elems[2] vertices = set() for src, dst in g.keys(): vertices.add(src) vertices.add(dst) vertices = list(vertices) vertices.sort() # create adjacency matrix mat = np.zeros((len(vertices), len(vertices))) for s, src in enumerate(vertices): for d, dst in enumerate(vertices): e = EdgeKey(src=src, dst=dst) if e in g: mat[s, d] = int(g[e]) # print adjacency matrix print ' ' , ' '.join(vertices) # print header for i, row in enumerate(mat): print vertices[i], ' '.join([str(int(c)) for c in row.tolist()])