[Python-es] Ordenar de acuerdo a columnas

Kiko kikocorreoso en gmail.com
Vie Ene 6 13:22:02 CET 2012


El 6 de enero de 2012 09:36, lasizoillo <lasizoillo en gmail.com> escribió:

> El día 6 de enero de 2012 08:51, ezequiel <ezecastillo en gmail.com>
> escribió:
> > Hola a todos y feliz comienzo de año,
> >
> > Les paso a explicar mi problema: en una parte de mi código escribo a
> > un archivo de salida con el siguiente comando:
> >
> >    'outfile.write("%8.4f %10.4E %8.3f %10.4E %10.4E\n" % (d[i], p[j],
> >    qa[k], fuerza, ft[i]))'
> >
> > es decir, ya tengo los arreglos por separado. Pero esta orden se
> > encuentra dentro de tres loops que iteran con respecto a 'i', 'j' y 'k'
> > De modo tal que el archivo de salida tiene la siguiente pinta:
> >
> >
> > #  dist      alpha    carga      fuerza fuerza-teo
> > 12.0000 1.0000E-03    0.100 -9.2793E+01 -3.0569E+02
> > 12.0000 1.0000E-03    1.200 -1.1306E+02 -3.0569E+02
> > 12.0000 1.0000E-03    2.300 -1.1436E+02 -3.0569E+02
> > ...
> > 12.0025 1.0000E-03    0.100 -9.2679E+01 -3.0510E+02
> > 12.0025 1.0000E-03    1.200 -1.1290E+02 -3.0510E+02
> > ...
> >
> > Lo que quiero hacer es tener para cada combinación de alpha y carga
> > (p[] y qa[]) (que no se encuentran continuas), todos los valores de
> > distancia y fuerzas correspondientes, o sea mi archivo de salida
> > tendría que quedar algo asi:
> >
> > #    alpha    carga    dist      fuerza fuerza-teo
> > 1.0000E-03    0.100 12.0000 -9.2793E+01 -3.0569E+02
> > 1.0000E-03    0.100 12.0025 -9.2679E+01 -3.0510E+02
> > ...
> > 1.0000E-03    1.200 12.0000 -1.1306E+02 -3.0569E+02
> > 1.0000E-03    1.200 12.0025 -1.1290E+02 -3.0510E+02
> > ...
> > 1.0000E-03    2.300 12.0000 -1.1436E+02 -3.0569E+02
> > ...
> >
> > y así sucesivamente para las distintas combinaciones.
> > Hace una semana que empecé a programar en Python, por lo que les pido
> > disculpas si esto es muy fácil de hacer.
> >
>
>
> Hola.

Podrías usar argsort [1] incluido en numpy (parece que haces cosas de
ciencia por lo que te recomiendo usar numpy).

Un ejemplo tonto (en la consola de ipython):

*In [29]: import numpy as np

In [30]: a = np.array((np.arange(20), np.random.randn(20))) #Creamos un
array
In [31]: a[0,3] = 0 #Repetimos un elemento en la primera columna para que
se parezca a tu problema
In [32]: a
Out[32]:
array([[  0.        ,   1.        ,   2.        ,   0.        ,
          4.        ,   5.        ,   6.        ,   7.        ,
          8.        ,   9.        ,  10.        ,  11.        ,
         12.        ,  13.        ,  14.        ,  15.        ,
         16.        ,  17.        ,  18.        ,  19.        ],
       [  0.62109734,  -1.66227531,  -0.13531228,  -0.36858396,
          0.20819283,  -1.91722834,   0.43300811,  -1.92397695,
         -0.09230548,   0.14619123,   1.59821385,  -0.28736747,
          0.66816904,  -1.65682382,  -0.16931408,  -1.52021098,
         -1.27927906,   1.51208342,  -1.22674823,   0.70934827]])
In [33]: a.argsort() #Esto te daría los índices ordenados de menor a mayor
para tu array en cada una de las columnas
Out[33]:
array([[ 0,  3,  1,  2,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
        17, 18, 19],
       [ 7,  5,  1, 13, 15, 16, 18,  3, 11, 14,  2,  8,  9,  4,  6,  0, 12,
        19, 17, 10]])*

[1]
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html#numpy.argsort

Espero te sirva.

Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120106/be5c2010/attachment.html>


Más información sobre la lista de distribución Python-es