【问题标题】:Better rounding in Python's NumPy.around: Rounding NumPy ArraysPython 的 NumPy.around 中更好的舍入:舍入 NumPy 数组
【发布时间】:2012-08-12 02:19:03
【问题描述】:

我正在寻找一种以更直观的方式对 numpy 数组进行舍入的方法。我有几个浮点数,并希望将它们限制在小数点后几位。 这将是这样完成的:

>>>import numpy as np
>>>np.around([1.21,5.77,3.43], decimals=1)
array([1.2, 5.8, 3.4])

现在,当尝试对恰好在舍入步骤之间的数字进行舍入时,就会出现问题。我希望 0.05 舍入到 0.1,但 np.around 设置为舍入到“最近的 even 数”。这会产生以下结果:

>>>np.around([0.55, 0.65, 0.05], decimals=1)
array([0.6, 0.6, 0.0])

然后我的问题是,最有效的方法是四舍五入到最接近的数字,而不仅仅是最接近的偶数。

有关 np.around 的更多信息,请参阅its documentation

【问题讨论】:

  • python round() 而不是 numpy.around()?
  • 0.05 与 0.0 和 0.1 的距离完全相同;也不是最近的。 “最近偶数”规则的原因是为了减少整体误差。
  • 是的,这种行为是浮点数的 IEEE 标准。此外,如果您知道您将始终使用特定精度的浮点数,python 有一个 decimal 类型
  • 为什么需要对它们进行四舍五入?只是为了显示一些没有不必要的小数的结果?

标签: python arrays numpy rounding


【解决方案1】:

around 这样做的方式是正确的,但是如果您想做一些不同的事情,例如,您可以减去一个比舍入精度小得多的数量,例如,

def myround(a, decimals=1):
     return np.around(a-10**(-(decimals+5)), decimals=decimals)

In [22]: myround(np.array([ 1.21,  5.77,  3.43]), 1)
Out[22]: array([ 1.2,  5.8,  3.4])

In [23]: myround(np.array([ 0.55,  0.65,  0.05]), 1)
Out[23]: array([ 0.5,  0.6,  0. ])

我在这里选择5 的原因是,由于不包括偶数/奇数的区别,你隐含地引入了大约 10**(-(decimal+1))/2 的平均误差,所以你不应该'不要抱怨该错误的 1/10000 的显式错误。

【讨论】:

  • 您能否详细解释一下引入更高错误率的含义?
  • @Will:你的问题能更明确一点吗?例如,我没有看到我在哪里提到“引入更高的错误率”,也不知道您所说的那个短语是什么意思。
  • @tom10 我的意思是“我在这里选择 5 的原因是,由于不包括偶数/奇数的区别,你隐含地引入了大约 10 **(-(decimal+ 1))/2 所以你不应该抱怨那个错误的 1/10000 的显式错误。”
  • @Will:对于像 1.23456 这样的数字,OP(最初)不喜欢根据 5 右侧数字的奇偶性进行舍入(在本例中为 6,即偶数),他建议不要使用这种方法。我指出不使用奇偶校验会引入错误,并建议了一种替代方法,该方法仍然会引入错误,但我的错误将比 OP 的无奇偶校验方法小 10^5(或 100,000)倍。那么,实际上,这只是清楚地表明最好使用奇偶校验方法,它不会引入显式错误。
  • 哇,这太疯狂了!为什么要将中间的数字舍入到下一个偶数而不是默认情况下向上舍入,因为现实世界中的每个人都在这样做?这意味着 0、0.1、0.2...四舍五入到整数的偶数级数将给您 6 个零、9 个一、11 个二、9 个三...不好。
猜你喜欢
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多