我有一个值列表
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
,但我总是得到一个错误。我做错了什么?
我们将非常感谢您的帮助!
答案 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倍。