【问题标题】:Python Sigma SumsPython Sigma 和
【发布时间】:2013-07-12 18:21:14
【问题描述】:

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

【问题讨论】:

  • 你得到什么错误?您可以发布完整的回溯吗? (一方面,您在sum 行中缺少一个结束括号)。另一个问题是 parameter[i]*parameter[i]==0 行实际上什么都不做(它只是将 parameter[i]*parameter[i] 与 0 进行比较,并且对结果不做任何事情。
  • 括号已修复。现在它返回 y 作为零列表,但这不应该是结果。那么如何将其更改为使 parameter[i]*parameter[i] 实际上为零并对结果产生影响?
  • x[i]*x[i] 必须为零”,您的意思是 x 必须完全由零组成,还是您想说您想从 @ 的计算中排除 x[i]*x[i] 987654345@?
  • @user2357112 我想从计算中排除 x[i]*x[i]

标签: python list numpy


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您的结果不正确。应该是[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
    • 哦,我明白了。我认为这个问题是进步的。那么,比我想象的要容易。实际上,这很微不足道。
    【解决方案3】:

    前面的答案在用 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 倍。

    【讨论】:

    • 你能测试一下x * (x.sum() - x)吗?恐怕我目前无法访问 numpy 安装。 (我什至不确定 x.sum() - x 是否像我认为的那样工作。)
    • @user2357112,我测试过,确实是正确的。好多了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2021-10-08
    • 2013-05-06
    • 2017-05-31
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多