【问题标题】:Python3 strange list reversalPython3奇怪的列表反转
【发布时间】:2011-02-22 04:50:06
【问题描述】:

大家好,所以我在 python 中为一个类实现了离散傅立叶变换的简单版本,但是我的输出发生了一些奇怪的事情,我不知道为什么。例如,如果我的输入是 [a,b,c,d],则值会像 [a',d',c',b'] 一样被打乱,列表的头部位于同一位置,但其他值相反.这是我的代码:

def DFT(pts, carr):
  t = time.clock()
  F =[0]*pts
  for k in range(pts):
    c = 2j*k*math.pi/pts
    for n in range(pts):
      F[k] += complex(carr[n]) * cmath.exp(n*c)
  t = time.clock()-t
  print(str(pts) + " point DFT finished in " + str(t) + "s")
  return F

它超级简单,但由于某种原因,它会随意翻转数组,我不知道为什么。有人知道这里发生了什么吗?我确定输入的顺序正确。

【问题讨论】:

  • 你能给我们一些值来传递给你的函数以及预期的结果吗?

标签: python python-3.x


【解决方案1】:

我相信您在计算 c 时遗漏了一个负号(请参阅 this link)。

使用您的代码:

>>> DFT(4, [1, 2, 3, 4])
4 point DFT finished in 0.0310370227732s
[(10+0j), (-2.0000000000000004-1.9999999999999996j), (-2+9.797174393178826e-16j), (-1.9999999999999982+2.000000000000001j)]

缺少负号:

>>> DFT(4, [1, 2, 3, 4])
4 point DFT finished in 4.17962941128e-05s
[(10+0j), (-2.0000000000000004+1.9999999999999996j), (-2-9.797174393178826e-16j), (-1.9999999999999982-2.000000000000001j)]

【讨论】:

    【解决方案2】:

    在您提供的特定代码段中,除了分配给 F 之外,我们看不到任何列表操作。再次,您无需使用 += 运算符,只使用 = 就可以了。 除此之外,考虑一下这个简单的列表分配案例,它可以帮助您跟踪代码中的问题。

    当您将列表分配给新列表时。它们引用同一个对象。所以,如果你修改新的,原来的也会被修改。我假设在您的代码中发生了很长的这些行。

    >>> l = [1,2,3,4]
    >>> n = l
    >>> n.reverse()
    >>> n
    [4, 3, 2, 1]
    >>> l
    [4, 3, 2, 1]
    

    【讨论】:

    • 对不起,这太离谱了……考虑到我正在建立以前的值,+= 是非常必要的。不,考虑到我在这个方法中创建和初始化它并只返回它,修改一些“原始”列表不是问题。感谢您的尝试。
    • DFT 就是这样怪异的 - 由于所涉及算法的对称性,算术错误最终可能看起来像序列加扰(就像在这种情况下发生的那样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多