Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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_Algorithm_Language Agnostic - Fatal编程技术网

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

Python 规范化数组中的所有其他元素,python,algorithm,language-agnostic,Python,Algorithm,Language Agnostic,我有这样一个数组(存储为PythonFractions): 我将某个元素(本例中的第二个元素)乘以某个已知因子(1/2): 因此,答案是: [????, 1/4, ???] == 1, where arr[0] and arr[2] are proportionate to their original values. 如何对数组的其余部分进行归一化,使数组的和仍然为1,但第二个元素保持不变(在本例中为0.25),其余元素按比例更改?首选Python,但我实际上只是在寻找一种方法。我尝试将其余

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

我将某个元素(本例中的第二个元素)乘以某个已知因子(
1/2
):

因此,答案是:

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

如何对数组的其余部分进行归一化,使数组的和仍然为1,但第二个元素保持不变(在本例中为
0.25
),其余元素按比例更改?首选Python,但我实际上只是在寻找一种方法。我尝试将其余元素与因子相加/相乘,但没有效果。

我认为此函数可以解决您的问题

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。

您能举一个例子说明所需的归一化数组是什么样子吗?@Danoram不,我不明白。我知道第一个索引上的
[1/2,1/2]
因子为
1/2
会导致
[1/4,1/2]
,然后是
[1/4,3/4]
。但我无法将其可视化为较长的数组。您说第一个元素保持不变,但
0.25
是数组中的第二个元素。我只是想澄清哪些元素正在改变,哪些没有。请在帖子中输入错误,谢谢。我已经说得更清楚了。这看起来很难!我投票结束这个问题,因为它看起来基本上是一个数学问题,而不是一个编程问题。你是个天才!!!
[????, 1/4, ???] == 1, where arr[0] and arr[2] are proportionate to their original values.
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)]