Сгенерировать строковое представление одноразовой кодировки - PullRequest
3 голосов
/ 11 октября 2009

В Python мне нужно сгенерировать dict, который отображает букву в предопределенное представление " one-hot " этой буквы. В качестве иллюстрации, dict должно выглядеть так:

{ 'A': '1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0',
  'B': '0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0', # ...
}

Существует один бит (представленный в виде символа) на каждую букву алфавита. Следовательно, каждая строка будет содержать 25 нулей и один 1. Положение 1 определяется положением соответствующей буквы в алфавите.

Я придумал код, который генерирует это:

# Character set is explicitly specified for fine grained control
_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
n = len(_letters)
one_hot = [' '.join(['0']*a + ['1'] + ['0']*b)
            for a, b in zip(range(n), range(n-1, -1, -1))]
outputs = dict(zip(_letters, one_hot))

Есть ли более эффективный / чище / более питонический способ сделать то же самое?

Ответы [ 4 ]

7 голосов
/ 11 октября 2009

Я считаю это более читабельным:

from string import ascii_uppercase

one_hot = {}
for i, l in enumerate(ascii_uppercase):
    bits = ['0']*26; bits[i] = '1'
    one_hot[l] = ' '.join(bits)

Если вам нужен более общий алфавит, просто перечислите строку символов и замените ['0']*26 на ['0']*len(alphabet).

2 голосов
/ 11 октября 2009

В Python 2.5 и выше вы можете использовать условный оператор:

from string import ascii_uppercase

one_hot = {}
for i, c in enumerate(ascii_uppercase):
    one_hot[c] = ' '.join('1' if j == i else '0' for j in range(26))
1 голос
/ 11 октября 2009
one_hot = [' '.join(['0']*a + ['1'] + ['0']*b)
            for a, b in zip(range(n), range(n-1, -1, -1))]
outputs = dict(zip(_letters, one_hot))

В частности, в эти две строки упакован лот кода. Вы можете попробовать рефакторинг Intrangeing Variable . Или, может быть, метод извлечения .

Вот один пример:

def single_onehot(a, b):
    return ' '.join(['0']*a + ['1'] + ['0']*b)

range_zip = zip(range(n), range(n-1, -1, -1))
one_hot = [ single_onehot(a, b) for a, b in range_zip]
outputs = dict(zip(_letters, one_hot))

Хотя вы можете не согласиться с моим наименованием.

0 голосов
/ 11 октября 2009

Мне это кажется довольно ясным, лаконичным и питонским.

...