2011-05-18 6 views
7

estoy usando genfromtxt importar esencialmente una matriz 2D que tiene todos sus valores listados en un archivo de texto de la forma (x y de los años y son enteros):la conversión de una lista de puntos a una matriz 2D numpy

x1 y1 z1 
    x2 y2 z2 
    : : : 

Estoy usando el ciclo for a continuación pero estoy bastante seguro de que debe haber una forma de una línea para hacerlo. ¿Cuál sería una forma más eficiente de hacer esta conversión?

raw = genfromtxt(file,skip_header = 6) 

xrange = (raw[:,0].min() , raw[:,0].max()) 
yrange = (raw[:,1].min() , raw[:,1].max()) 

Z = zeros((xrange[1] - xrange[0] +1 , yrange[1] - yrange[0] +1)) 

for row in raw: 
    Z[ row[0]-xrange[0] , row[1]-yrange[0] ] = row[2] 
+0

La primera pregunta debería ser ¿por qué estás usando genfromtxt? ¿Hay valores faltantes en la entrada? ¿Realmente quieres que el punto de partida para estos cálculos sea una matriz enmascarada? – talonmies

Respuesta

3

puede reemplazar el bucle for con lo siguiente:

xidx = (raw[:,0]-xrange[0]).astype(int) 
yidx = (raw[:,1]-yrange[0]).astype(int) 

Z[xidx, yidx] = raw[:,2] 
+0

+1 ¡Pásame! Estaba en el medio de escribir esto ... –

+0

Eso es exactamente lo que estaba buscando. ¡Gracias! – foglerit

0

Para importar una matriz de un archivo, puede dividir las líneas y luego convertirlas a int.

[[int(i) for i in j.split()] for j in open('myfile').readlines()] 

por supuesto, supongo que su archivo solo contiene la matriz.

Al final, puede convertir esta matriz 2-D en numpy.

+2

¿Por qué es esto mejor que la función de importación más fácil '' genfromtxt'' (o '' loadtxt'' en este caso) de numpy? – joris

0

Usted puede intentar algo como esto:

>>> Z = zeros((3, 3)) 
>>> test = array([[0, 1, 2], [1, 1, 6], [2, 0, 4]]) 
>>> Z[test[:, 0:2].T.tolist()] 
array([ 0., 0., 0.]) 
>>> Z[test[:, 0:2].T.tolist()] = test[:, 2] 
>>> Z 
array([[ 0., 2., 0.], 
     [ 0., 6., 0.], 
     [ 4., 0., 0.]]) 

En su caso:

Z[(raw[:, 0:2] - minimum(raw[:, 0:2], axis=0)).T.tolist()] = raw[:, 2] 
0

También podría ir con numpy.searchsorted que también permitirá datos de espacio/flotante no igualmente espaciados:

raw = genfromtxt(file,skip_header = 6) 

xvalues = numpy.sorted(set(raw[:,0])) 
xidx = numpy.searchsorted(xvalues, raw[:,0]) 

yvalues = numpy.sorted(set(raw[:,1])) 
yidx = numpy.searchsorted(yvalues, raw[:,1]) 

Z = numpy.zeros((len(xvalues), len(yvalues))) 
Z[xidx, yidx] = raw[:,2] 

De lo contrario, estaría siguiendo la respuesta de Simon.

Cuestiones relacionadas