Как мне использовать метод Numpy vstack?

Во-первых, вот соответствующая часть кода:

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

Итак, в основном, каждый раз, когда код stokes_line, stokes_line извлекает один из столбцов (четвертый) из файла temp.txt, и я хочу, чтобы он каждый раз добавлял строку в stokes_list.

Например, если первый stokes_line

1.1 2.2 3.3  

а второй

4.4 5.5 6.6  

тогда stokes_list будет

1.1 2.2 3.3  
4.4 5.5 6.6  

и будет продолжать расти...

Это не работает на данный момент, потому что я думаю, что линия:

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

не является правильным. Это только сложение 2 списков - что имеет смысл, поскольку у меня есть только 2 аргумента. В принципе, я хотел бы знать, как я продолжаю укладывать снова и снова.

Любая помощь будет принята с благодарностью!
Если это необходимо, вот пример формата файла 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  

Ответ 1

vstack ing снова и снова не хорошо, потому что он копирует все массивы.

Создайте для него обычный Python list, .append, а затем передайте его целиком на np.vstack, чтобы создать новый массив один раз.

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

big_stokes = np.vstack(stokes_list)

Ответ 2

Вы уже знаете окончательный размер массива stokes_list так как знаете numrows. Так что, похоже, вам не нужно увеличивать массив (что очень неэффективно). Вы можете просто назначить правильную строку на каждой итерации. Просто замените свою последнюю строку на:

stokes_list[i] = stokes_line

Кстати, о вашей нерабочей линии я думаю, что вы имели в виду:

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

где вы заменяете stokes_list его новым значением.