2013-04-10 51 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)]