numpy 如何将数组四舍五入?

kadbb459  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(120)

我有一个numpy数组,类似于下面:

data = np.array([  1.60130719e-01,   9.93827160e-01,   3.63108206e-04])

字符串
我想把每个元素四舍五入到小数点后两位
我怎么能这样做呢?

daupos2t

daupos2t1#

Numpy提供了两个相同的方法来实现这一点。

np.round(data, 2)

字符串

np.around(data, 2)


因为它们是等价的。
有关详细信息,请参阅文档。
示例如下:

>>> import numpy as np
>>> a = np.array([0.015, 0.235, 0.112])
>>> np.round(a, 2)
array([0.02, 0.24, 0.11])
>>> np.around(a, 2)
array([0.02, 0.24, 0.11])
>>> np.round(a, 1)
array([0. , 0.2, 0.1])

kh212irz

kh212irz2#

值得注意的是,被接受的答案会将小浮点数四舍五入为零,如下所示:

>>> import numpy as np 
>>> arr = np.asarray([2.92290007e+00, -1.57376965e-03, 4.82011728e-08, 1.92896977e-12])
>>> print(arr)
[ 2.92290007e+00 -1.57376965e-03  4.82011728e-08  1.92896977e-12]
>>> np.round(arr, 2)
array([ 2.92, -0.  ,  0.  ,  0.  ])

字符串
您可以使用set_printoptions和自定义格式化程序来解决这个问题,并获得一个小数位数更少的更numpy-esque的格式:

>>> np.set_printoptions(formatter={'float': "{0:0.2e}".format})
>>> print(arr)
[2.92e+00 -1.57e-03 4.82e-08 1.93e-12]


通过这种方式,您可以获得format的全部多功能性,并保持numpy数据表的精度。
还要注意,这只影响打印,而不影响用于计算的存储值的实际精度。

8ftvxx2r

8ftvxx2r3#

如果您希望输出为

array([1.6e-01, 9.9e-01, 3.6e-04])

字符串
问题并不是NumPy缺少的功能,而是这种舍入不是一个标准的事情。你可以创建自己的舍入函数,它可以像这样实现:

def my_round(value, N):
    exponent = np.ceil(np.log10(value))
    return 10**exponent*np.round(value*10**(-exponent), N)


对于处理0和负值的一般解决方案,您可以这样做:

def my_round(value, N):
    value = np.asarray(value).copy()
    zero_mask = (value == 0)
    value[zero_mask] = 1.0
    sign_mask = (value < 0)
    value[sign_mask] *= -1
    exponent = np.ceil(np.log10(value))
    result = 10**exponent*np.round(value*10**(-exponent), N)
    result[sign_mask] *= -1
    result[zero_mask] = 0.0
    return result

相关问题