【问题标题】:Generate a string representation of a one-hot encoding生成 one-hot 编码的字符串表示
【发布时间】:2009-10-10 20:22:06
【问题描述】:

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

有没有更高效/更简洁/更 Pythonic 的方式来做同样的事情?

【问题讨论】:

    标签: python data-generation


    【解决方案1】:

    我觉得这更具可读性:

    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)

    【讨论】:

    • 不错。我想我在函数式编程方面尝试了一次丑陋的尝试。不过,您的版本更具可读性。
    • ascii_uppercase 的使用很不错(我什至不知道它存在。),但我不确定这是否比原始代码更具可读性。列表理解很简洁,但也很有表现力。在我看来,使用显式循环会使代码的目的不那么清晰。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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))
      

      特别是,这两行中包含 很多 代码。您可以尝试Introduce Explaining Variable 重构。或者可能是extract method

      这是一个例子:

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

      虽然你可能不同意我的命名。

      【讨论】:

        【解决方案4】:

        这对我来说似乎非常清晰、简洁和 Pythonic。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-29
          • 2021-07-20
          • 2017-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-14
          相关资源
          最近更新 更多