【问题标题】:Truncating decimal digits numpy array of floats截断十进制数字numpy浮点数组
【发布时间】:2017-06-20 16:34:25
【问题描述】:

我想截断 numpy 数组中的浮点值,例如

2.34341232 --> 2.34 

我阅读了truncate floating point 的帖子,但它只是一个浮动。我不想在 numpy 数组上运行一个循环,它会非常昂贵。 numpy 中是否有任何内置方法可以轻松做到这一点?我确实需要输出为浮点数而不是字符串。

【问题讨论】:

  • Numpy 提供了 around 方法。语法为np.around(numpy_array, num_decimals)。例如:a = np.array([2.3434]), np.around(a, 2) --> produces array([2.34])。这就是你要找的东西吗?
  • 这看起来像个骗子:stackoverflow.com/questions/21008858/…
  • 您是真的想丢弃小数点后第二位的数据,还是只是想改变数据的显示方式?如果是前者,请使用numpy.aroundnumpy.round 方法。
  • @AlonAlexander num = ((num*100)//1)/100 这个逻辑只适用于正值。例如,将负值截断为小数点后,x = -2.134 然后(-2.134*10//1)10 给出-3,这是不可接受的答案。!

标签: python numpy vectorization


【解决方案1】:

试用numpy.trunc() 的修改版。

import numpy as np
def trunc(values, decs=0):
    return np.trunc(values*10**decs)/(10**decs)

遗憾的是,numpy.trunc 函数不允许小数截断。幸运的是,将参数相乘并将其结果除以 10 的幂可以得到预期的结果。

vec = np.array([-4.79, -0.38, -0.001, 0.011, 0.4444, 2.34341232, 6.999])

trunc(vec, decs=2)

返回:

>>> array([-4.79, -0.38, -0.  ,  0.01,  0.44,  2.34,  6.99])

【讨论】:

  • 很高兴地报告这似乎只在 np.around 的一半时间运行任何人切换他们的舍入 -> 截断逻辑。
  • 这应该是公认的答案。
【解决方案2】:

使用numpy.round:

import numpy as np
a = np.arange(4) ** np.pi
a
=> array([  0.        ,   1.        ,   8.82497783,  31.5442807 ])
a.round(decimals=2)
=> array([  0.  ,   1.  ,   8.82,  31.54])

【讨论】:

  • 当问题是关于截断而不是四舍五入时,这个答案如何? (我知道,我知道,提问者接受了它。所以我真的对他们感到迷惑,甚至比这个答案更迷惑。)
  • 如果不小心,舍入可能会很微妙。请查看我的真实截断答案。
  • 我认为这个答案对这个问题是不正确的。随便,所有数组元素中的第三个小数小于 5,因此输出成功,但是如果将小数('a.round(decimals=3)')更改为 1 或 3,则输出 8.825,出了什么问题,如果你想截断,它应该输出 8.254
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多