2011-05-18 4 views
7

J'utilise genfromtxt importer essentiellement un tableau 2D qui a toutes ses valeurs indiquées dans un fichier texte de la forme (x et de y sont des entiers):Conversion d'une liste de points à un tableau 2D numpy

x1 y1 z1 
    x2 y2 z2 
    : : : 

J'utilise la boucle for ci-dessous, mais je suis à peu près certaine qu'il doit y avoir une seule ligne pour le faire. Quel serait un moyen plus efficace de faire cette conversion?

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 première question devrait être pourquoi utilisez-vous genfromtxt? Y a-t-il des valeurs manquantes dans l'entrée? Voulez-vous vraiment que le point de départ de ces calculs soit un tableau masqué? – talonmies

Répondre

3

Vous pouvez remplacer la boucle avec les éléments suivants:

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

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

+1 Battez-moi! J'étais en train de taper ça ... –

+0

C'est exactement ce que je cherchais. Je vous remercie! – foglerit

0

Pour importer une matrice à partir d'un fichier, vous pouvez simplement diviser les lignes, puis convertir en int.

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

bien sûr, je suis en supposant que votre fichier ne contient que la matrice. A la fin, vous pouvez convertir ce tableau 2D en numpy.

+2

Pourquoi est-ce mieux que la fonction d'importation plus facile '' genfromtxt'' (ou '' loadtxt'' fera dans ce cas) de numpy? – joris

0

Vous pouvez essayer quelque chose comme ceci:

>>> 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.]]) 

Dans votre cas:

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

Vous pouvez aussi aller avec numpy.searchsorted qui permettra également des données non uniformément espacées/flottantes:

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] 

Sinon, je suivrais la réponse de Simon.

Questions connexes