Python Sigma Sums

时间:2013-07-12 18:21:15

标签: python list numpy

我有一个值列表 X = [1,-1,-1,1,1,-1,1,-1,1,-1] 我有另一张空白名单 y=[ ]

我正在尝试创建一个函数,该函数将在x中取一个sigma值并将它们存储在y中。

例如,y[0]应为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),它应该用上面描述的sigma总和打印列表y,但我总是得到一个错误。我做错了什么? 我们将非常感谢您的帮助!

3 个答案:

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

如果你正在使用numpy,请用numpy操作替换sum和列表理解:

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

答案 1 :(得分: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,依此类推。

答案 2 :(得分:0)

以前的答案很好地用python做你想做的事。这是通过使用外部产品来实现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-130倍。