【问题标题】:How to normalize a list of positive and negative decimal number to a specific range如何将正负十进制数列表标准化为特定范围
【发布时间】:2013-05-07 00:54:27
【问题描述】:

我有一个十进制数列表如下:

[-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21]

我需要规范化这个列表以适应[-5,5] 的范围。
我如何在python中做到这一点?

【问题讨论】:

标签: python list range normalize


【解决方案1】:

获取输入范围很容易:

old_min = min(input)
old_range = max(input) - old_min

这是棘手的部分。您可以乘以新范围并除以旧范围,但这几乎可以保证顶部存储桶只会得到一个值。您需要扩大输出范围,使顶部存储桶的大小与所有其他存储桶的大小相同。

new_min = -5
new_range = 5 + 0.9999999999 - new_min
output = [floor((n - old_min) / old_range * new_range + new_min) for n in input]

【讨论】:

  • 为什么要使用“幻数”0.9999999999?如果有人有一个范围 [0,1] 怎么办?那么这个数字是多少呢?
  • @Nairum 正如我在答案中解释的那样,“幻数”总是相同的;目的是在 1 以下。因为输出是整数,所以任何小数部分都会丢失。对于范围 [0,1],您不想精确缩放到范围 [0,1.0],否则几乎所有输入都将转换为 0。如果您缩放到 [0,1.9999999999],您将得到分布更均匀。
  • @Nairum 感谢您让我再次查看此答案,您让我意识到存在错误;输出范围 (-1,1) 映射到 0,使得该存储桶是其他存储桶的两倍。
【解决方案2】:

保持简单:

>>> foo = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21]
>>> [i for i in foo if int(i) in range(-5, 5)]
[-4.5, 2]

此外,如果您希望结果只是整数:

>>> [int(i) for i in foo if int(i) in range(-5, 5)]
[-4, 2]

【讨论】:

  • @Cerin 不否认可能是这种情况,这个问题已有一年多的历史了,我的回答是在 OP 收到任何可接受的答案或反馈之前。没有必要恢复它。
【解决方案3】:
>>> L = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21]
>>> normal = map(lambda x, r=float(L[-1] - L[0]): ((x - L[0]) / r)*10 - 5, L)
>>> normal
[-5.0, -2.5730337078651684, -4.348314606741574, -2.2584269662921352, -1.7865168539325844, -0.7303370786516856, 0.7303370786516847, 2.0786516853932575, 2.752808988764045, 3.6516853932584272, 4.101123595505618, 5.0]

【讨论】:

    【解决方案4】:
    original_vals = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21 ]
    
    # get max absolute value
    original_max = max([abs(val) for val in original_vals])
    
    # normalize to desired range size
    new_range_val = 5
    normalized_vals = [float(val)/original_max * new_range_val for val in original_vals]
    

    【讨论】:

    • 只是一个小点,你不需要max中的内部列表:max(abs(val) for val in original_vals)也可以。
    • 谢谢-使用生成器总是很好!我也刚刚意识到最后一行容易受到零除法的影响,这对于基于范围的方法来说是一个优势。
    【解决方案5】:

    假设您的列表已排序:

    # Rough code
    # Get the range of the list
    r = float(l[-1] - l[0])
    # Normalize
    normal = map(lambda x: (x - l[0]) / r, l)
    

    基本上,您希望将列表的基数调整到不同的范围。这会将您的原始列表标准化为 [0, 1]

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 2020-10-05
      • 2016-01-07
      • 2017-05-02
      • 2016-10-31
      • 2016-08-19
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多