2011-12-22 22 views
8

Tôi mới để python và numpy vì vậy xin vui lòng tha cho tôi nếu vấn đề này là rất thô sơ! Tôi có một mảng các giá trị âm (nó được sắp xếp):Dài (> 20million yếu tố) mảng tổng kết trong python numpy

>>>neg 
[ -1.53507843e+02 -1.53200012e+02 -1.43161987e+02 ..., -6.37326136e-1 -3.97518490e-10 -3.73480691e-10] 
>>>neg.shape 
(12922508,) 

tôi cần phải thêm mảng này để trùng lặp của nó (nhưng với các giá trị tích cực) để tìm độ lệch chuẩn của phân phối trung bình để zero. Vì vậy, tôi làm như sau:

>>>pos=-1*neg 
>>>pos=pos[::-1] #Just to make it look symmetric for the display bellow! 
>>>total=np.hstack((neg,pos)) 
>>>total 
[-153.50784302 -153.20001221 -143.1619873 ..., 143.1619873 153.20001221 153.50784302] 
>>>total.shape 
(25845016,) 

Cho đến nay mọi thứ đều rất tốt, nhưng điều lạ là tổng của mảng mới này không phải là zero:

>>>numpy.sum(total) 
11610.6 

Độ lệch chuẩn cũng không phải là ít tất cả gần những gì tôi đã mong đợi nhưng tôi đoán gốc của vấn đề đó là giống như thế này: Tại sao không tổng kết quả bằng không?

Khi tôi áp dụng phương pháp này cho một mảng nhỏ; ví dụ [-5, -3, -2] tổng trở thành 0. Vì vậy, tôi đoán vấn đề nằm trong chiều dài của mảng (hơn 20 triệu phần tử). Có cách nào để giải quyết vấn đề này không?

Nếu có ai có thể giúp tôi về điều này, tôi sẽ biết ơn nhất.

+2

'math.fsum (total)' return '0'? – jfs

+0

Có chứ !!! WOW !!! Bạn có nghĩa là tôi không nên sử dụng numpy ở tất cả, tôi đã ở trong quan niệm sai lầm rằng numpy là công cụ tốt nhất để làm việc trên mảng! Nhưng tìm kiếm trong http://docs.python.org/py3k/library/math.html#module-math Tôi không thấy bất kỳ công cụ nào để tính toán Độ lệch chuẩn. Bạn sẽ đề xuất điều gì? – makhlaghi

+0

Không. 'Fsum()' chỉ để kiểm tra sự chắc chắn rằng mã của bạn không có một số lỗi khác ngoài việc mất độ chính xác trong quá trình tổng kết. ['numpy.std()'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html) có thể được sử dụng cho Độ lệch Chuẩn. Hãy thử 'np.std (total, dtype = np.float64)'. – jfs

Trả lời

3

Như đã lưu ý trong các nhận xét, bạn sẽ nhận được các vấn đề về làm tròn nổi từ tổng hợp nhiều triệu số đã ký bằng nhau. Một cách tốt xung quanh này có thể kết hợp các số dương và âm trong mảng kết hợp, do đó bất kỳ kết quả trung gian trong khi tổng hợp luôn luôn xấp xỉ trong cùng bậc độ lớn:

neg = -100*numpy.random.rand(20e6) 
pos = -neg 
combined = numpy.zeros(len(neg)+len(pos)) 
combined[::2] = neg 
combined[1::2] = pos 

Bây giờ combined.sum() nên được khá gần số không.

Có lẽ cách tiếp cận này cũng sẽ giúp cải thiện độ chính xác trong tính toán độ lệch chuẩn.

+0

Tổng số đã trở thành chính xác bằng 0, do đó, giá trị trung bình cũng không bằng 0. nhưng điều kỳ lạ là độ lệch chuẩn không thay đổi so với trước đây. Trừ khi 'numpy.std()' sử dụng một phương thức khác để tính tổng (ví dụ trong mô-đun 'math.fsum()') kết quả này không được chấp nhận vì trong khi 'numpy.sum()' và 'numpy.mean() 'thay đổi,' numpy.std() 'không !!!! – makhlaghi

+1

Bạn sẽ cần phải thực hiện 'std()' chính mình bằng cách sử dụng các kỹ thuật chúng tôi mô tả để làm các tổng kết trong công thức. –

+0

Tôi đã viết một chương trình để tính toán 'std()' bản thân mình; tìm ra sự khác biệt của từng giá trị với mức trung bình trong các gói 10.000 phần tử, tổng kết quả và cuối cùng chia cho số lượng các phần tử và tìm căn bậc hai. Mất khoảng 15 phút để tính toán độ lệch chuẩn cho tất cả> 25 triệu phần tử và nó chính xác tìm thấy cùng giá trị với 'numpy.std()' (mất một phần nhỏ của giây)! Tập dữ liệu này là một thử nghiệm cho thuật toán của tôi: như tôi đã nói tôi đã biết độ lệch chuẩn ngay từ đầu. Tôi sẽ kiểm tra nguồn gốc của độ lệch chuẩn đó để xem nó có đúng hay không! – makhlaghi

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