2012-09-06 10 views
7

Spędziłem wieki na tym (prostym) kodzie Pythona, a dzięki temu forum już prawie jestem. Naprawdę mam nadzieję, że ktoś może ustawić mnie prosto, aby to działało w 100%!jak używać numpy vstack

Po pierwsze, jest tu odpowiednia część kodu:

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

Więc w zasadzie, za każdym razem kod opasuje, stokes_line ciągnie jedna z kolumn (4) z jednego pliku „temp.txt” i Chcę, aby za każdym razem dodawał linię do "stokes_list".

Na przykład, jeśli pierwszy stokes_line jest

1.1 2.2 3.3 

a drugi

4.4 5.5 6.6 

następnie stokes_list będzie

1.1 2.2 3.3 
4.4 5.5 6.6 

i będzie stale rosnąć ...

To nie działa w tej chwili, bo myślę, że linia:

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

nie jest poprawna. Układa tylko 2 listy - co ma sens, ponieważ mam tylko 2 argumenty. Zasadniczo chciałbym wiedzieć, w jaki sposób ciągle się układam.

Każda pomoc zostanie bardzo wdzięcznie przyjęta!
Jeśli jest to potrzebne, tutaj jest przykładem formatu pliku 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 

Odpowiedz

32

vstack ing znowu i znowu nie jest dobre, ponieważ kopiuje całe tablice.

Tworzenie normalnego Pythona list, .append do niego, a następnie przekazać go w całości do np.vstack stworzyć nową tablicę raz.

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

big_stokes = np.vstack(stokes_list) 
+0

Dziękuję - to bardzo pomocne – user1551817

+4

+1 dla "nie umieszczaj vstack w pętli". – mak

8

Już teraz ostateczny rozmiar tablicy stokes_list ponieważ wiesz numrows. Wygląda więc na to, że nie musisz rozbudowywać tablicy (co jest bardzo nieefektywne). Możesz po prostu przypisać prawidłowy wiersz w każdej iteracji. Wystarczy wymienić swój ostatni wiersz przez:

stokes_list[i] = stokes_line 

Nawiasem mówiąc, o linii nieprodukcyjnym Chyba masz na myśli:

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

gdzie jesteś zastępując stokes_list przez jego nową wartość.

+0

To jest lepsze rozwiązanie niż moje, jeśli znane jest 'numrows' (jak w tym przypadku). – eumiro

+0

Dziękujemy! To wspaniale! – user1551817