3

我有一个值列表 x=[1,-1,-1,1,1,-1,1,-1,1,-1] 并且我有另一个空白列表 y=[ ]

我正在尝试创建一个函数,该函数将取值的 sigma 总和x并将它们存储在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)which should print list ywith the sigma sums 上面描述的,但我总是得到一个错误。我做错了什么?非常感谢您的帮助!

4

3 回答 3

7

你在这里做了太多的打字和计算。如果您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)
于 2013-07-12T19:33:43.043 回答
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,以此类推。

于 2013-07-12T18:24:59.000 回答
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 倍不等。

于 2013-07-12T19:37:56.100 回答