Python西格玛和
我有一个价值清单 x=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
[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,我测试过,它确实正确。好多了!