规范化数组中的所有其他元素

Normalise all other elements in array

我有一个这样的数组(存储为 Python Fractions):

[3/10, 1/2, 1/5] == 1

然后我将某个元素(在本例中为第二个)乘以某个已知因子(此处为 1/2):

[3/10, 1/4, 1/5] != 1

所以答案是:

[????, 1/4, ???] == 1, where arr[0] and arr[2] are proportionate to their original values.

如何规范化数组的 rest,使数组总和仍然为 1,但第二个元素保持不变(0.25 在这种情况下) 其余元素按比例更改? Python 首选,但我真的只是在寻找一种方法。我已经 adding/multiplying 按系数尝试了其余元素,但它不起作用。

我觉得这个功能可以解决你的问题

from fractions import Fraction as frac

old_list = [frac(3, 10), frac(1, 2), frac(1, 5)]


def multiply_frac_item(frac_list, item_index, frac_multiplier):
    old_item = frac_list[item_index]
    new_item = old_item * frac_multiplier
    for i in range(len(frac_list)):
        if (i == item_index):
            frac_list[i] = new_item
        else:
            frac_list[i] = frac_list[i] * (1 - new_item) / (1 - old_item)
    return frac_list


new_list = multiply_frac_item(old_list, 1, frac(1, 2))
print(new_list)
assert sum(new_list) == 1

>>> [Fraction(9, 20), Fraction(1, 4), Fraction(3, 10)]

您基本上将列表中的其余项目乘以相同的因子 ((1 - new_item) / (1 - old_item)) 其中旧项目和新项目代表的元素您要相乘的列表。这将保持相同的比例(因为所有项目将乘以相同的因子)并保持列表的总和等于 1。