【问题标题】:Numpy average function rounding off errorNumpy 平均函数舍入误差
【发布时间】:2013-09-04 20:02:56
【问题描述】:

我觉得这很奇怪。谁能告诉我这里发生了什么?

>>>a = [1,0,1]
>>>np.mean(a)
   0.66666666666666663
>>>2.0/3
   0.6666666666666666

np.mean(a) 的输出末尾的 3 是怎么回事?为什么它不是像它下面的行那样的 6 或 7(四舍五入时)?

【问题讨论】:

  • 为什么投反对票?至少解释一下。这个接缝完全合理...除非您实际上没有阅读问题...
  • @Brian 这个问题在这个论坛上已经回答了很多很多次了。
  • @Ophion 投反对票,评论说这是一个骗子,并链接到一个。当受骗者没有出现在搜索或相关列表中时,为什么人们应该“打了就跑”对新用户投反对票?
  • @Brain 你得问他们,但这是一个谷歌很容易回答的问题,基本上是在 SO 问题 checklist 上检查 #1。
  • @Ophion:这不是您每天看到三次的标准OMG, 0.1 + 0.2 = 0.30000004!!,这似乎是一个让我感到惊讶的有效问题。

标签: python numpy average


【解决方案1】:

这只是两种不同类型的不同字符串表示的情况:

In [17]: a = [1, 0, 1]

In [18]: mean(a)
Out[18]: 0.66666666666666663

In [19]: type(mean(a))
Out[19]: numpy.float64

In [20]: 2.0 / 3
Out[20]: 0.6666666666666666

In [21]: type(2.0 / 3)
Out[21]: float

In [22]: mean(a).item()
Out[22]: 0.6666666666666666

它们比较相等:

In [24]: mean(a) == 2.0 / 3
Out[24]: True

In [25]: mean(a).item() == 2.0 / 3
Out[25]: True

现在可能是了解numpy scalarsnumpy dtypes 的时候了。

【讨论】:

  • 一个 python 浮点数也应该是 64 位的,numpy 的打印方式还是有点奇怪。
  • @BasSwinckels 不确定我是否遵循您的论点。您是说因为它们都是具有 64 位表示的浮点类型,因此它们应该repr 相同,即使它们在类型层次结构中是不同的类型?
  • 我知道它们是具有不同代表​​的不同类型,但两者都应该包装相同的 float64 值。在这种情况下,似乎没有做任何努力来让 repr 显示它真正是什么类型,所以我只是觉得有点奇怪他们不使用相同的算法来创建字符串表示。
  • 我会冒险猜测这已经在 NumPy ML 上讨论过了。我真的没有时间研究它,但我敢打赌你会在那里找到更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多