【问题标题】:Strange Python output for counter loop [duplicate]计数器循环的奇怪 Python 输出 [重复]
【发布时间】:2016-08-31 19:20:25
【问题描述】:
import numpy as np
    from numpy.random import randn
    N = 100000
    counter = 0
    for i in randn(N):
        if i < 1 and i > -1:
            counter = counter + 1
    counter/N

代码每次都输出零。

我将 100000 更改为 100000.0,它给了我 68%,但告诉我以下信息:

anaconda/lib/python2.7/site-packages/ipykernel/ma​​in.py:5: VisibleDeprecationWarning:使用非整数而不是 整数以后会报错”

你能帮我弄清楚发生了什么吗?

【问题讨论】:

  • 你能格式化代码吗?
  • 那是因为integer division。当您使用浮点数时,它可以正常工作,但这不是 randn 的合适输入。因此,要么使用 Python 3 的除法(检查链接答案以导入该部分),要么将最后一行更改为 counter/float(N)
  • 只是一个友好的建议,您可以将第 n°7 行替换为 counter += 1
  • 您没有返回任何内容。您的缩进很奇怪(第一行之后的所有内容都缩进了太多次),这可能会导致问题。
  • 关于 VisibleDeprecationWarning - 它出现是因为函数 numpy.random.randn 不喜欢接收浮点参数。

标签: python loops numpy random counter


【解决方案1】:

您正在执行整数除法。整数除法的意思是,它会将除法的结果四舍五入,比如

>>> print(99 / 100)
0

您可以通过将一个(或两个)操作数转换为浮点数来执行“正常”除法。

float(counter) / float(N)

您看到的另一个效果(VisibleDeprecationWarning)是由于在这种情况下Nfloat。函数randn 将整数作为参数,而不是浮点数。见numpy.random.randn。旧版本的 numpy 允许使用浮点数,但现在已弃用。这意味着,它仍然可以工作,但不再是好的做法。

【讨论】:

  • 谢谢你,用户:)
【解决方案2】:

首先,我建议您正确缩进您的代码,以便用户可以直接运行它来诊断您的错误。无论如何,鉴于您的 sn-p 格式正确:

import numpy as np
from numpy.random import randn

N = 100000
counter = 0
for i in randn(N):
    if i < 1 and i > -1:
        counter = counter + 1

print(counter, N, counter / N)

当您使用 python 2.x 执行 counter/N 时会出现问题,如果是这种情况,您需要显式地强制转换为浮动 float(counter)/float(N)。如果您只是使用 python 3.x,浮动转换将自动完成,因此您无需显式执行此操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多