Python数学通过索引从两个列表索引中添加数字

时间:2013-04-10 04:29:16

标签: python list math

我仍然是Python的初学者。我正在尝试实现一种算法,该算法涉及矢量和矢量之间的归一化差异。方程式为

Sr = 1 - ( || r1 - r2|| / || r1 + r2|| )

A given example gives r1 and r2 as shown below. 

r1 = {1 2 3 4 5 6 0 3 3 0 0 0 1 1}
r2 = {4 0 3 0 0 0 1 2 3 5 6 7 8 9}

Sr = 0.2023

公式的细分看起来像这样。

r1-r2 is the subtracting the item1 in r1 to the item1 in r2, subtracting the item2 in r1 to item2 in r2,..., until item-n in r1 and r2.

Let's say M is the total sum of (r1-r2)
M = sum(r1-r2) = sum[(1-4) + (2-0) +...+(1-9)]

||r1 - r2|| = math.sqrt(x)(math.(M, 2))

基本上我可以做所有其他数学相关的功能,但是我在找到一种有效的方法来计算M时遇到问题,我需要通过索引从两个列表索引中添加/减去数字。任何建议都会很棒。谢谢!

6 个答案:

答案 0 :(得分:0)

这是你想要的吗?

>>> r1 = [1, 2, 3 ,4 ,5 ,6 ,0 ,3 ,3 ,0 ,0 ,0 ,1 ,1]
>>> r2 = [4 ,0 ,3 ,0 ,0 ,0 ,1 ,2 ,3 ,5, 6 ,7 ,8 ,9]
>>> [r1[i]-r2[i] for i in range(0,len(r1))]
[-3, 2, 0, 4, 5, 6, -1, 1, 0, -5, -6, -7, -7, -8]
>>> [r1[i]+r2[i] for i in range(0,len(r1))]
[5, 2, 6, 4, 5, 6, 1, 5, 6, 5, 6, 7, 9, 10]

答案 1 :(得分:0)

>>> r1 = [1, 2, 3, 4, 5, 6, 0, 3, 3, 0, 0, 0, 1, 1]
>>> r2 = [4, 0, 3, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9]
>>> sum([x-y for x, y in zip(r1, r2)])
-19

说明:

  • zip返回[(r1[0], r2[0]),...,(r1[n], r2[n])]
  • 形式的元组列表
  • 列表理解将执行r1[n]-r2[n]并返回结果列表

答案 2 :(得分:0)

总结一下

map(sum, zip(r1, r2))

并且你可以做差异

map(lambda t: t[0] - t[1] ,zip(r1, r2))

其中r1r2是列表。

答案 3 :(得分:0)

要解决数学问题的sum部分,您可以执行以下操作:

sum(map(operator.__sub__, r1, r2))

这将在元素或r1r2之间执行减法,然后对结果列表求和。

答案 4 :(得分:0)

numpy可以简化您的生活:

>>> import numpy as np
>>> r1 = np.array([1, 2, 3, 4, 5, 6, 0, 3, 3, 0, 0, 0, 1, 1])
>>> r2 = np.array([4, 0, 3, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9])
>>> 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
0.20227596478253429

您的问题没有明确说明您需要哪种规范。但答案似乎是正确的,这意味着你需要常规的2范数。另请参阅numpy.linalg.norm

答案 5 :(得分:0)

感谢所有回答的人。如果我可以为你们所有人投票,我愿意。我决定选择Reinier Torenbeek的答案,因为它在一个简单的函数中完成了我想要做的所有事情。

这是我使用这部分的等式的方法。

def wordOrderSim(list1, list2):
    r1 = np.array(list1)
    r2 = np.array(list2)
    Sr = 1 - np.linalg.norm(r1-r2) / np.linalg.norm(r1+r2)
    return Sr

r1 = [1, 2, 3 ,4 ,5 ,6 ,0 ,3 ,3 ,0 ,0 ,0 ,1 ,1]
r2 = [4 ,0 ,3 ,0 ,0 ,0 ,1 ,2 ,3 ,5, 6 ,7 ,8 ,9]

print wordOrderSim(r1, r2)

感谢Serdalis,Sushant Gupta,Sheng和Paulo Scardine的回答,因为它确实回答了我的问题,但是我忘了提到在加入/减去r1和r2中的数字之后,每个数字都必须是将所有这些数字加在一起之前的两个原始数字。对不起,如果没有正确的数学符号,我很难解释它们。

r1-r2 = [-3, 2, 0, 4, 5, 6, -1, 1, 0, -5, -6, -7, -7, -8]
sum(r1-r2) = [(-3^2) + (2^2) + (0^2) + (4^2) + (5^2) + (6^2) + (-1^2) + (1^2) + (0^2) + (-5^2 + (-6^2) + (-7^2) + (-7^2) + (-8^2)]