截断浮点数的十进制数字numpy数组

bla*_*bug 5 python numpy vectorization

我想截断numpy数组中的float值,例如。

2.34341232 --> 2.34 
Run Code Online (Sandbox Code Playgroud)

我阅读了截断浮点后的内容,但其中有一个浮点。我不想在numpy数组上运行循环,这将非常昂贵。numpy中是否有任何内置方法可以轻松做到这一点?我确实需要将输出作为浮点数而不是字符串。

shx*_*hx2 10

使用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])
Run Code Online (Sandbox Code Playgroud)

  • 当问题是*截断*而不是四舍五入时,这如何回答?(我知道,我知道,提问者接受了。所以我真的对他们感到困惑,甚至比这个答案还要困惑。) (43认同)
  • 我认为这个答案对于问题来说并不正确。偶然,所有数组元素中的第三个小数都小于 5,因此输出成功,但是如果将小数('a.round(decimals=3)')更改为 1 或 3,则会输出 8.825,出了什么问题,如果你想截断,它应该输出 8.254 (4认同)
  • 如果不小心,舍入可能很微妙。请参阅我的答案以获得真正的截断。 (3认同)

Tra*_*olf 6

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

import numpy as np
def trunc(values, decs=0):
    return np.trunc(values*10**decs)/(10**decs)
Run Code Online (Sandbox Code Playgroud)

可悲的是,该numpy.trunc函数不允许十进制截断。幸运的是,将参数乘以结果除以十的幂即可得出预期的结果。

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

trunc(vec, decs=2)
Run Code Online (Sandbox Code Playgroud)

返回:

>>> array([-4.79, -0.38, -0.  ,  0.01,  0.44,  2.34,  6.99])
Run Code Online (Sandbox Code Playgroud)

  • 很高兴地报告,对于任何切换舍入 -> 截断逻辑的人来说,这似乎只需要“np.around”一半左右的时间。 (3认同)