2012-09-06 20 views
7

Tôi đã sử dụng độ tuổi trên mã Python (đơn giản) này và nhờ diễn đàn này, tôi đã gần đến. Tôi thực sự hy vọng ai đó có thể đặt tôi thẳng để làm cho nó hoạt động 100%!cách sử dụng numpy vstack

Thứ nhất, đây là phần có liên quan của mã:

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

Vì vậy, về cơ bản, mọi mã chạy vòng quanh, stokes_line kéo một trong các cột (một thứ 4) từ tập tin 'temp.txt' và Tôi muốn nó thêm một dòng vào 'stokes_list' mỗi lần.

Ví dụ, nếu stokes_line đầu tiên là

1.1 2.2 3.3 

và thứ hai là

4.4 5.5 6.6 

sau đó stokes_list sẽ

1.1 2.2 3.3 
4.4 5.5 6.6 

và sẽ tiếp tục tăng trưởng ...

Hiện tại, công việc này không hoạt động vì tôi cho rằng dòng:

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

không chính xác. Nó chỉ xếp chồng 2 danh sách - điều này có ý nghĩa vì tôi chỉ có 2 đối số. Tôi về cơ bản muốn biết làm thế nào tôi giữ xếp chồng một lần nữa và một lần nữa.

Bất kỳ trợ giúp nào cũng sẽ rất biết ơn!
Nếu nó là cần thiết, đây là một ví dụ về định dạng của tập tin 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 

Trả lời

32

vstack ing một lần nữa và một lần nữa là không tốt, bởi vì nó sao chép toàn bộ mảng.

Tạo một Python bình thường list, .append và sau đó chuyển toàn bộ thành np.vstack để tạo mảng mới một lần.

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

big_stokes = np.vstack(stokes_list) 
+0

Cảm ơn bạn - điều đó rất hữu ích – user1551817

+4

+1 cho "không đặt vstack trong vòng lặp". – mak

8

Bây giờ bạn đã là kích thước cuối cùng của mảng stokes_list vì bạn biết numrows. Vì vậy, có vẻ như bạn không cần phải phát triển một mảng (rất không hiệu quả). Bạn chỉ có thể chỉ định hàng chính xác tại mỗi lần lặp. Chỉ cần thay thế dòng cuối cùng của bạn bằng cách:

stokes_list[i] = stokes_line 

Bằng cách này, về dòng không làm việc của bạn tôi nghĩ bạn có nghĩa là:

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

nơi bạn đang thay thế stokes_list bởi giá trị mới của nó.

+0

Đây là một giải pháp tốt hơn so với tôi nếu 'numrows' được biết trước (như trong trường hợp này). – eumiro

+0

Cảm ơn bạn! Thật tuyệt! – user1551817

Các vấn đề liên quan