Python西格玛和

Python西格玛和,python,list,numpy,Python,List,Numpy,我有一个价值清单 x=[1,-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]到y[9]执行此操作 此外,在总和中,x[i]*x[i]必须为零。因此,例如在y[0]中,x[0

我有一个价值清单 x=
[1,-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]到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
x=[1,-1,-1,1,1,1,-1,1,-1,1,-1]
y=[]
def列表扩展器(参数):
对于参数中的i:
参数[i]*参数[i]==0
变量=numpy.sum(参数[i]*参数[:])
如果变量>0:
变量=1

如果变量好,我认为这应该是正确的。为了便于阅读,我将其分为两种理解:

首先,得到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,依此类推

这里的输入和计算太多了。如果先计算
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,请将
sum
和列表理解替换为numpy操作:

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

前面的答案很好地解决了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
numpy: 10000 loops, best of 5: 72.7 us per loop
pure python: 100 loops, best of 5: 9.67 ms per loop
对于100个元素的列表:

numpy:  10000 loops, best of 5: 29.4 us per loop
pure python: 1000 loops, best of 5: 119 us per loop
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倍不等

你有什么错误?你能发布完整的回溯吗?(一方面,
sum
行中缺少一个结束括号)。另一个问题是,
parameter[i]*parameter[i]==0
行实际上什么都不做(它只是将
parameter[i]*parameter[i]
与0进行比较,并且对结果不做任何处理。括号已经被修复。现在它返回y作为一个零列表,但这不应该是结果。那么如何将其更改为具有
parameter[i]*参数[i]
实际为零并对结果产生影响?通过“
x[i]*x[i]
必须为零”,您的意思是
x
必须完全由零组成,还是您想说您想将
x[i]*x[i]
y[i]
的计算中排除?@user2357112我想排除x[i]*x[i]从计算中你的结果是不正确的。它应该是
[-1,-1,-1,-1,-1,-1,-1]
。哦,我明白了。我认为这个问题是渐进的。比我想象的容易。实际上,这很简单。你能测试一下
x*(x.sum()-x)
吗?恐怕我现在没有权限使用numpy安装。(我甚至不确定
x.sum()-x
是否能像我想的那样工作。)@user2357112,我测试过,它确实正确。好多了!