2010-02-02 4 views
1

У меня есть текстовый файл с номерами в нем следующим образом:энтропии в текстовом файле

1231313123123123 
1432423432535345 
3532523452345345 
1231423432453455 
3434535345345345 
3452353453253453 

все линии имеют одинаковую длину, я хочу, чтобы вычислить энтропию на каждой линии и имеют выход как:

2.64234234 
2.65464564 
2.35355435 
etc. 

Прямо сейчас с этой частью кода я даю мне энтропию, чтобы быть тем же, что я делаю неправильно?

Спасибо.

#!/usr/bin/env python 

import math 

def H(data): 
    if not data: 
    return 0 
    entropy = 0 
    for x in range(256): 
    p_x = float(data.count(chr(x)))/len(data) 
    if p_x > 0: 
     entropy += - p_x*math.log(p_x, 2) 
    return entropy 

failas = open('text.txt', 'r') 
for row in failas: 
     print H('failas') 
+1

Поскольку у вас есть 10 уникальных цифр на символ, разве вы не должны использовать базу 10 в своем журнале? например entropy + = - p_x * math.log (p_x, 10) – Cerin

+0

FWIW код, очевидно, копирует/вставляет с http://blog.dkbza.org/2007/05/scanning-data-for-entropy-anomalies.html – tripleee

ответ

10
failas = open('text.txt', 'r') 
for row in failas: 
    print H(row) 
+3

Или, может быть, просто 'for row in open ('text.txt')'? – Triptych

+2

Или 'с открытым ('text.txt') как failas:' –

5

Возможно, вы имели в виду print H(row).

1

Все вышеперечисленное, плюс вы, вероятно, не хотите включать \n в конце каждой строки в вычислении энтропии. Использовать H(row.rstrip('\n'))

Вы можете ответить на многие свои вопросы, изучив данные, которые бросает ваш код. В этом случае вставка print repr(data) после строки def H(data): показала бы вам, что проблема была сразу.

Смежные вопросы