2012-09-06 15 views
7

He pasado años en este código (simple) de Python, y gracias a este foro estoy casi allí. ¡Realmente espero que alguien me pueda aclarar para que funcione al 100%!cómo usar numpy vstack

En primer lugar, aquí está la parte correspondiente del código:

stokes_list = np.zeros(shape=(numrows,1024)) # 'numrows' defined earlier 
for i in range(numrows): 
    epoch_name = y['filename'][i] # 'y' is an array from earlier 
    os.system('pdv -t {0} > temp.txt '.format(epoch_name)) # 'pdv' is a command from another piece of software - here I copy the output into a temporary file 
    stokes_line = np.genfromtxt('temp.txt', usecols=3, dtype=[('stokesI','float')], skip_header=1) 
    stokes_list = np.vstack((stokes_line,stokes_line)) 

Así que, básicamente, cada vez que se enrolla alrededor de la código, stokes_line tira de una de las columnas (cuarto) uno de la 'temp.txt' archivo y Quiero que agregue una línea a 'stokes_list' cada vez.

Por ejemplo, si el primer stokes_line es

1.1 2.2 3.3 

y el segundo es

4.4 5.5 6.6 

continuación stokes_list habrá

1.1 2.2 3.3 
4.4 5.5 6.6 

y va a seguir creciendo ...

No está funcionando en este momento, porque creo que la línea:

stokes_list = np.vstack((stokes_line,stokes_line)) 

no es correcto. Solo está apilando 2 listas, lo que tiene sentido ya que solo tengo 2 argumentos. Básicamente me gustaría saber cómo sigo apilando una y otra vez.

¡Cualquier ayuda sería muy bien recibida!
Si es necesario, aquí es un ejemplo del formato del archivo temp.txt:

File: t091110_065921.SFTC Src: J1903+0925 Nsub: 1 Nch: 1 Npol: 4 Nbin: 1024 RMS: 0.00118753 
0 0 0 0.00148099 -0.00143755 0.000931365 -0.00296775 
0 0 1 0.000647476 -0.000896698 0.000171287 0.00218597 
0 0 2 0.000704697 -0.00052846 -0.000603842 -0.000868739 
0 0 3 0.000773361 -0.00234724 -0.0004112 0.00358033 
0 0 4 0.00101559 -0.000691062 0.000196023 -0.000163109 
0 0 5 -0.000220367 -0.000944024 0.000181002 -0.00268215 
0 0 6 0.000311783 0.00191545 -0.00143816 -0.00213856 

Respuesta

32

vstack ing una y otra vez no es bueno, porque copia los enteros matrices.

Cree una Python normal list, .append y luego páselo entero a np.vstack para crear una nueva matriz una vez.

stokes_list = [] 
for i in xrange(numrows): 
    ... 
    stokes_line = ... 
    stokes_list.append(stokes_line) 

big_stokes = np.vstack(stokes_list) 
+0

Gracias, eso es muy útil – user1551817

+4

+1 para "no poner vstack en un bucle". – mak

8

Ya ahora el tamaño final de la matriz stokes_list ya que usted sabe numrows. Entonces parece que no necesitas hacer crecer una matriz (que es muy ineficiente). Simplemente puede asignar la fila correcta en cada iteración. simplemente reemplazar su última línea por:

stokes_list[i] = stokes_line 

Por cierto, acerca de su línea de trabajo no creo que quería decir:

stokes_list = np.vstack((stokes_list, stokes_line)) 

donde está reemplazando stokes_list por su nuevo valor.

+0

Esta es una solución mejor que la mía si se conoce 'numrows' antes (como en este caso). – eumiro

+0

¡Gracias! ¡Eso es genial! – user1551817