Python 如何对numpy数组进行舍入?

Python 如何对numpy数组进行舍入?,python,arrays,numpy,rounding,Python,Arrays,Numpy,Rounding,我有一个numpy数组,如下所示: data = np.array([ 1.60130719e-01, 9.93827160e-01, 3.63108206e-04]) 我想把每个元素四舍五入到小数点后两位 我怎样才能做到 Numpy提供了两种相同的方法。任用 np.round(data, 2) 或 因为它们是等价的 有关更多信息,请参阅 示例: >>将numpy作为np导入 >>>a=np.数组([0.015,0.235,0.112]) >>>np.圆形(a,2) 数组([0.

我有一个numpy数组,如下所示:

data = np.array([  1.60130719e-01,   9.93827160e-01,   3.63108206e-04])
我想把每个元素四舍五入到小数点后两位


我怎样才能做到

Numpy提供了两种相同的方法。任用

np.round(data, 2)

因为它们是等价的

有关更多信息,请参阅


示例:

>>将numpy作为np导入
>>>a=np.数组([0.015,0.235,0.112])
>>>np.圆形(a,2)
数组([0.02,0.24,0.11])
>>>np.关于(a,2)
数组([0.02,0.24,0.11])
>>>np.圆形(a,1)
数组([0,0.2,0.1])

如果希望输出

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
def my_round(值,N):
value=np.asarray(value).copy()
零屏蔽=(值==0)
值[zero_mask]=1.0
符号屏蔽=(值<0)
值[符号掩码]*=-1
指数=np.ceil(np.log10(值))
结果=10**指数*np.四舍五入(值*10**(-指数),N)
结果[符号掩码]*=-1
结果[zero_mask]=0.0
返回结果

值得注意的是,被接受的答案将小浮点数舍入为零

>>> 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\u printoptions
和自定义格式设置程序来解决此问题,并获得更具numpy风格、小数位数更少的打印输出:

>>> np.set_printoptions(formatter={'float': "{0:0.2e}".format})
>>> print(arr)
[2.92e+00 -1.57e-03 4.82e-08 1.93e-12]  
这样,您就可以充分利用
格式的多功能性,并保持numpy数据类型的全部精度


还要注意,这只会影响打印,而不会影响用于计算的存储值的实际精度

np.round(数据,2)
?您的示例运行良好。你说“不工作”是什么意思?
np.round
相当于
np.around
,两者都适用于整个数组。你到底希望舍入的输出是什么?我想他应该说,如何将十进制
1.60130719e-01
后的数字减少到
1.60
数组不是np数组,在像np.array一样导入之后,其工作方式也可用作方法:
a.round(decimals=2)
这或多或少是我想要的。使用
np.around
而不是
round
将使其也适用于多维数组。
>>> np.set_printoptions(formatter={'float': "{0:0.2e}".format})
>>> print(arr)
[2.92e+00 -1.57e-03 4.82e-08 1.93e-12]