Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当一个值必须保持不变时,如何规范化浮动列表?_Python_List_Floating Point_Normalize - Fatal编程技术网

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

Python 当一个值必须保持不变时,如何规范化浮动列表?,python,list,floating-point,normalize,Python,List,Floating Point,Normalize,我有一个包含这些标准化值的列表 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] 这很容易确定所有值在初始列表中是否共享相同

我有一个包含这些标准化值的列表

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
的适当部分?

您可以

  • 计算剩余的
  • 计算未更改值的总数,以获得未更改值的相对比例
  • 将它们的值与剩余值相乘以将其考虑在内,然后除以相对总数以使它们与总数成比例

要理解除了剩余的目的之外的
总数,如果没有它,就会是这样

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

使用
change\u normalized
项并使列表保持规范化:
re_normalize
通过乘以正确的因子(即1与未更改项的总和之间的比率)来保持列表的规格化:

此代码可以收缩为:

def change_normalized(lst, index, value):
    lst[index] = value
    multiply_factor = (1 - value) / (sum(lst) - value)
    lst[:] = [multiply_factor * x if i != j else x for j, x in enumerate(lst)

您始终可以强制所有剩余值相同,因此第一个算法仍然有效

def change_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
change_normalized(list_b, i, value)

# 1.0
print(sum(list_b))
def change_normalized(lst, index, value):
    lst[index] = value
    multiply_factor = (1 - value) / (sum(lst) - value)
    lst[:] = [multiply_factor * x if i != j else x for j, x in enumerate(lst)