2013-04-10 84 views
0

我仍然是Python的初学者。我正试图实现一个涉及向量和向量之间归一化差异的算法。该公式如下给出: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,其中我需要从两个列表指数指数加/减的数字有问题。任何建议都会很棒。谢谢!

+0

你试过'zip'吗? – Patashu 2013-04-10 04:32:50

+2

很难说如何改进你编写的代码而不看你尝试过的代码。然而,这听起来像你应该使用numpy-numpy数组可以被添加或减少(或许多其他操作),并按元素执行操作元素。 – 2013-04-10 04:33:14

+0

@David Robinson - 我只需要找到一种方法来首先添加/从两个列表元素中减去元素...我从来没有使用numpy。我会研究这一点。谢谢。 – Cryssie 2013-04-10 04:35:05

回答

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

+0

谢谢。你的答案是最优雅的,但对我来说这是危险的,因为我没有真正理解你提供的numpy和代码。我将不得不看看你给我的链接,这样我才能确定我得到了正确的等式。 – Cryssie 2013-04-10 05:11:55

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

说明:

  • 拉链返回表格元组的列表[(r1[0], r2[0]),...,(r1[n], r2[n])]
  • 列表解析会执行r1[n]-r2[n]并返回结果列表
0

总之,只要做

map(sum, zip(r1, r2)) 

和区别,你可以做

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

其中r1r2是列表。

0

做你的数学题的sum部分,你可以做到以下几点:

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

这将执行元件或r1r2相减,再总结的结果列表。

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古普塔,盛和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)]