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

Normalise all other elements in array

提问人:Dara Java 提问时间:12/4/2020 最后编辑:Dara Java 更新时间:12/4/2020 访问量:45

问:

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

[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.

如何对数组的其余部分进行归一化,使数组的总和仍然为 1,但第二个元素保持不变(在本例中),其余元素按比例更改?首选 Python,但我真的只是在寻找一种方法。我试过将其余元素添加/乘以因子,但它不起作用。0.25

Python 算法 与语言无关

评论

0赞 Danoram 12/4/2020
您能举例说明所需的归一化数组是什么样子吗?
0赞 Dara Java 12/4/2020
@Danoram 不,我想不通。我知道在第一个索引上的因子将导致 然后 .但是对于更长长度的数组,我无法将其可视化。[1/2, 1/2]1/2[1/4, 1/2][1/4, 3/4]
1赞 Danoram 12/4/2020
你说第一个元素保持不变,但却是数组中的第二个元素。我只是想澄清哪些元素正在改变,哪些没有。0.25
0赞 Dara Java 12/4/2020
帖子中的错别字,谢谢。我已经说得更清楚了。这看似困难!
1赞 Karl Knechtel 12/4/2020
我投票决定关闭这个问题,因为它从根本上说似乎是一个数学问题,而不是一个编程问题。

答:

1赞 Wassim Joane 12/4/2020 #1

我认为这个功能可以解决你的问题

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。