2013-07-12 42 views
3

我有價值觀 X = [1,-1,-1,1,1,-1,1,-1,1,-1] 的列表,我還有一個空白列表 y=[ ]Python的西格瑪總結

我想創建一個將可取的值的西格瑪總和x並將其存儲在一個功能y。例如,應該是x[0]*x[0] + x[0]*x[1] + x[0]*x[2] + ... + x[0]*x[9]的總和。

同樣,y[1]應該是x[1]*x[0] + x[1]*x[1] + x[1]*x[2]+ ... + x[1]*x[9]的總和。

這必須完成y[0] through y[9]

另外,在總和中,x[i]*x[i]必須爲零。因此,例如在y[0],x[0]*x[0]必須爲零。同樣,在y[1]的總和中,x[1]*x[1]必須爲零。

這是我的代碼,但它總是給我某種關於錯誤指數:

x=[1,-1,-1,1,1,-1,1,-1,1,-1] 
y=[] 
def list_extender(parameter): 
    for i in parameter: 
     parameter[i]*parameter[i]==0 
     variable=numpy.sum(parameter[i]*parameter[:]) 
     if variable>0: 
      variable=1 
     if variable<0: 
      variable=-1 
     y.append(variable) 
    return y 

然後我運行print list_extender(x)這應該打印列表y與上述西格瑪款項,但我總是得到一個錯誤。我做錯了什麼? 幫助將不勝感激!

+0

你會得到什麼錯誤?你可以發佈完整的追溯? (首先,你在'sum'行中缺少一個結束括號)。另一個問題是行參數[i] * parameter [i] == 0'確實沒有任何意義(它只是將參數[i] *參數[i]'與0進行比較,並且對結果沒有任何影響。 –

+0

圓括號有現在它返回y作爲一個零的列表,但這不應該是結果 那麼我如何改變它以使參數[i] *參數[i]'實際上爲零並且具有對結果的影響是什麼? –

+0

「'x [i] * x [i]'一定是零」,你的意思是'x'必須完全由零組成,還是你想說你想排除'x [i] * x [i]'from'y [i]'' – user2357112

回答

0

好的,我認爲這應該是正確的。我打破它分成兩個內涵的可讀性:

首先,獲得x的總和[N]:

def s(l): return sum([l[0]*l[i] for i in range (2, len(l))]) 

現在,只需通過x的子列表:

def sigma_sum(l): return [s(l[i:]) for i range (len(l)-1)] 

返回列表[-1,0,-1,0,-1,0,-1,0,-1]

哪一個是正確的:從x [8] * x [9]後退,我們得到-1。 -1 + 1 = 0-1 + 1 +( - 1)= -1等等。

+0

您的結果不正確,應該是'[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]'。 – tiago

+0

噢,我明白了,我認爲這個問題是進步的。想,然後呢,其實呢 不重要的。 –

6

你在這裏的輸入和計算太多了。如果您先計算出x的總和,那麼您的函數可以更短更簡單,然後用它來計算y的元素。它也會跑得更快。

只是這樣做:

x_sum = sum(x) 
y = [item * (x_sum - item) for item in x] 
# or, if you really want to store the results into an existing list y 
# y[:] = [item * (x_sum - item) for item in x] 

更換sum與numpy的操作列表理解,如果你正在使用numpy的:

import numpy as np 
x = np.array([1,-1,-1,1,1,-1,1,-1,1,-1]) 
y = x * (x.sum() - x) 
0

以前的答案在做你想要的東西的工作做得很好與蟒蛇。這裏是一個辦法與numpy的做到這一點,利用外產品:其中給出

import numpy as np 

x = np.array([1,-1,-1,1,1,-1,1,-1,1,-1]) 
a = np.outer(x, x) 
np.fill_diagonal(a, 0.) 
result = a.sum(0) 

array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]) 

如果非要然後,您可以將其轉換爲一個列表。

我使用@Ashwini Chaudhary的其他純python版本來定義此解決方案。這裏有你10元列表中的時序:

numpy: 10000 loops, best of 5: 29.4 us per loop 
pure python: 1000 loops, best of 5: 119 us per loop 

而對於一個100元素的列表:

numpy: 10000 loops, best of 5: 72.7 us per loop 
pure python: 100 loops, best of 5: 9.67 ms per loop 

所以它被4-130x更快範圍。

+0

你可以測試'x *(x.sum() - x)'嗎?恐怕我目前還沒有訪問一個numpy的安裝。 (我甚至不確定'x.sum() - x'是否像我認爲的那樣工作。) – user2357112

+0

@ user2357112,我測試過了,它確實是正確的。好多了! – tiago