当前位置: 首页 > 知识库问答 >
问题:

当一个值必须保持不变时,如何规范化浮点数列表?

林哲茂
2023-03-14

我有一个包含这些规范化值的列表

list_a = [0.25, 0.25, 0.25, 0.25]

现在我想把一个条目的值更改为另一个数字,比如说0.75。这个数字是固定的,不应该再改变了。

list_a_changed = [0.25, 0.25, 0.75, 0.25]

要确保列表中所有值的和加起来等于1,其余值需要为0.0833。所以我的清单必须是:

list_a_normalized = [0.083, 0.083, 0.75, 0.083]

如果所有值在初始列表中共享相同的百分比,这是很容易确定的。我可以只做1-0.75=0.25,并将0.25除以其余数字,因为它们在总数中所占百分比相同。

value_change = 0.75
remaining_value = 1 - value_change
divided_remaining_value = remaining_value / (len(list_a_changed) - 1)

list_a_normalized = [divided_remaining_value, divided_remaining_value, value_change, divided_remaining_value ]


但是如果原始列表是这样的,你会怎么做:

list_b = [0.25, 0.45, 0.20, 0.10]

我将一个值更改为0.05

list_b_changed = [0.25, 0.45, 0.05, 0.10]

您将如何计算其他数字的值,以便它们每个都包含剩余0.95的适当部分?

共有2个答案

袁法
2023-03-14

使用touch_normalizeditem并保持列表的规范化:
re_normalized通过与正确的因子相乘来保持列表的规范化(该因子是1与不带触摸项的和之间的比率):


def touch_normalized(lst, index, value):
    def touch(lst, index, value):
        lst[index] = value
    def re_normalize(lst, index, value):
        multiply_factor = (1 - value) / (sum(lst) - value)
        for j in range(len(lst)):
            if i == j:
                continue
            lst[j] *= multiply_factor
    touch(lst, i, value)
    re_normalize(lst, i, value)

i = 2
value = 0.05
list_b = [0.25, 0.45, 0.20, 0.10]

# Change item at index to value and keep list normalized
touch_normalized(list_b, i, value)

# 1.0
print(sum(list_b))
梁和颂
2023-03-14

你可以

  • 计算剩余
  • 计算不含变化值的总数,得到不含变化值的相对比例
  • 将它们的值乘以剩余值,然后除以相对总数,得到它们与总数成比例的值
def normalize(values, index_not_change):
    remaining = 1 - values[index_not_change]
    total_except_remaining = sum(values) - values[index_not_change]
    return [(value * remaining / total_except_remaining if idx != index_not_change else value)
            for idx, value in enumerate(values)]

print(normalize([0.25, 0.25, 0.75, 0.25], 2)) # [0.0833333333, 0.0833333333, 0.75, 0.0833333333]
print(normalize([0.25, 0.45, 0.05, 0.10], 2)) # [0.296875, 0.534375, 0.05, 0.11875000000000001]

要理解total_except_retains的用途,如果没有它的话,应该是

normalize([0.25, 0.25, 0.75, 0.25], 2) -> [0.0625, 0.0625, 0.75, 0.0625]

因为您需要计算剩余值的四分之一(0.25),但加上相对和是0.75而不是1,您将更新到它们的实际比例

您也可以使用相同的方法进行修改

def normalize(values, position, new_value):
    values[position] = new_value
    remaining = 1 - new_value
    total_except_remaining = sum(values) - new_value
    print(total_except_remaining)
    return [(value * remaining / total_except_remaining if idx != position else value)
            for idx, value in enumerate(values)]

print(normalize([0.25, 0.25, 0.25, 0.25], 2, 0.75))
 类似资料:
  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 小数转 2 进制 方法:乘2取整 对十进制小数乘2得到的整数部分和小数部分,整数部分既是相应的二进制数码,再用2乘小数部分(之前乘后得到新的小数部分),又得到整数和小数部分。如此不断重复,直到小数部分为0或达到精度要求为止。第一次所得到为最高位,最后一次得到为最低位。 如0.25的二进制: 0.25*2 = 0.5 取整是0, 0.5*2 =1.0 取整是1, 即0.25的二进制为 0.01(第一

  • 在浮动范围组件上使用ngModel时出现运行时错误。:未指定名称属性的窗体控件没有值访问器 有什么解决方案可以在这两个组件之间绑定ngModel数据吗?

  • 我一直在想,找到了很多方法,当格式化成字符串时,可以从doubles中删除.0,但从来没有找到过如何为价格保留东西。 但我需要的是这样的女人 这不是一个重复的,因为它会在我不想要的任何价格上加上00...我只是想去掉浮点,如果它后面有零,但如果有一个数字,就保留任何零。 例如。

  • 问题内容: Python是否提供了获取浮点值的功能,该函数是通过将现有浮点值的最低有效位递增而得到的? 我正在寻找类似于C ++ 11中添加的功能的东西。 问题答案: 这里有五个(实际上是四个半)解决方案。 解决方案1:使用Python 3.9或更高版本 2020年10月发布的Python 3.9包括一个新的标准库函数,该函数直接提供此功能:用于将下一个浮点数向正无穷大。例如: 如果查看方法提供的

  • 对于精度很重要的用例,推荐使用Python的本机浮点实现还是十进制实现? 我认为这个问题很容易回答:如果累积误差具有重要意义,例如可能在计算轨道轨迹等方面,那么一个精确的表示可能更有意义。 null

  • 假设我有以下内容: 将被提升为并且将比较两个数字,但是可以表示所有值吗?为什么不将和提升为?

  • 我只需要在Python中舍入浮点数的最后2个正数 EX: 0.000000302329303- 这是否可能以类似圆形的简单方式实现?