2014-11-06 19 views
18

Tôi cần chuẩn hóa danh sách các giá trị để phù hợp với phân phối xác suất, tức là từ 0,0 đến 1,0.Chuẩn hóa danh sách các số trong Python

Tôi hiểu cách để bình thường hóa, nhưng tò mò nếu Python có chức năng tự động hóa điều này.

Tôi muốn đi từ:

raw = [0.07, 0.14, 0.07] 

để

normed = [0.25, 0.50, 0.25] 
+2

tại sao điều đó wouldnt được '[0,5, 1,0, 0,5]'? –

+3

@Joran Vì OP muốn 'tổng (chuẩn) == 1.0' (bỏ qua các lỗi dấu phẩy động). – Kevin

+0

ahh Tôi thấy bây giờ ... –

Trả lời

32

Sử dụng:

norm = [float(i)/sum(raw) for i in raw] 

để đảm bảo rằng số tiền luôn luôn là 1.0 (hoặc càng gần như khả thi).

sử dụng

norm = [float(i)/max(raw) for i in raw] 

để bình thường hóa trở lại mức tối đa

+0

oh 5 giây nhanh hơn tôi :) đẹp – Anzel

+12

Tốt. Nó có thể đáng chú ý là tính toán số tiền trước, thay vì cho mỗi yếu tố trong hiểu, sẽ hiệu quả hơn. Vì vậy: 's = sum (raw); norm = [float (i)/s cho i in raw] ' – ohruunuruus

+0

Giống như' (np.array (x)/np.array (x) .sum())/np.array (x) .max() '? – alvas

4

thử:

normed = [i/sum(raw) for i in raw] 

normed 
[0.25, 0.5, 0.25] 
3

Không có bất kỳ chức năng trong thư viện chuẩn (để kiến ​​thức của tôi) mà sẽ làm điều đó, nhưng có những mô-đun hoàn hảo ngoài đó có các chức năng như vậy. Tuy nhiên, nó đủ mà bạn chỉ có thể viết chức năng riêng của mình dễ dàng: sản lượng

def normalize(lst): 
    s = sum(lst) 
    return map(lambda x: float(x)/s, lst) 

mẫu:

>>> normed = normalize(raw) 
>>> normed 
[0.25, 0.5, 0.25] 
+0

Đây là một trong hai câu trả lời trích xuất 'sum()' từ vòng lặp ... Tôi vẫn thích tôi nhưng tôi nghĩ đây là một '+' chính xác cho biến phụ trợ 's = sum (lst)'. – gboffi

+2

'normalize ([1,0, -1])' sẽ tăng 'ZeroDivisionError' :) –

6

bao lâu là danh sách các bạn đang đi bình thường?

def psum(it): 
    "This function makes explicit how many calls to sum() are done." 
    print "Another call!" 
    return sum(it) 

raw = [0.07,0.14,0.07] 
print "How many calls to sum()?" 
print [ r/psum(raw) for r in raw] 

print "\nAnd now?" 
s = psum(raw) 
print [ r/s for r in raw] 

# if one doesn't want auxiliary variables, it can be done inside 
# a list comprehension, but in my opinion it's quite Baroque  
print "\nAnd now?" 
print [ r/s for s in [psum(raw)] for r in raw] 

Output

# How many calls to sum()? 
# Another call! 
# Another call! 
# Another call! 
# [0.25, 0.5, 0.25] 
# 
# And now? 
# Another call! 
# [0.25, 0.5, 0.25] 
# 
# And now? 
# Another call! 
# [0.25, 0.5, 0.25] 
+2

+1 cho phiên bản baroque – njzk2

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