aja*_*esh 27 python arrays numpy
我有一个像下面这样的numpy数组:
data = [ 1.60130719e-01, 9.93827160e-01, 3.63108206e-04]
np.around(data,2) # doesn't work any alternatives ?
Run Code Online (Sandbox Code Playgroud)
我希望上面的值得到2小数点.
我知道np.around,它适用于单值但不适用于整个数组.
是否有一些容易在numpy中解决或者我是否需要使用np.around编写自己的函数?
Update-Array不是np数组,导入后像np.array一样工作.
Joe*_*don 28
你可以使用:
np.round(data, 2)
Run Code Online (Sandbox Code Playgroud)
要么:
np.around(data, 2)
Run Code Online (Sandbox Code Playgroud)
因为它们是等价的.
从文档:
numpy.around(a,decimals = 0,out = None)
均匀舍
round入到给定的小数位数.
您认为上述方法不起作用的原因是您导入的方式around.
从您的第一个示例开始,您似乎导入了:
from numpy import * #bad
import numpy as np #good
Run Code Online (Sandbox Code Playgroud)
如您所定义numpy.around(a, decimals=0, out=None)只arrays.但是,然后你尝试使用array(...)!
你必须坚持np.round(...)它*或np通过:
np.round(data, 2)
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用之间互换np.some_func(...),只是some_func(...)你会抛出一些点错误.您可能已经通过其他答案误导或文档作为标准是使用np的import as.
Mat*_*one 10
值得注意的是,接受的答案会将小浮点数舍入为零,如下所示:
>>> 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. ])
Run Code Online (Sandbox Code Playgroud)
您可以使用set_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]
Run Code Online (Sandbox Code Playgroud)
format通过这种方式,您可以获得numpy 数据类型的全部多功能性并保持其精度。
另请注意,这仅影响打印,而不影响用于计算的存储值的实际精度。
如果您希望输出为
array([1.6e-01, 9.9e-01, 3.6e-04])
Run Code Online (Sandbox Code Playgroud)
问题并不是 NumPy 真正缺失的功能,而是这种舍入不是标准的做法。您可以制作自己的舍入函数,如下所示:
def my_round(value, N):
exponent = np.ceil(np.log10(value))
return 10**exponent*np.round(value*10**(-exponent), N)
Run Code Online (Sandbox Code Playgroud)
对于一般解决方案处理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
Run Code Online (Sandbox Code Playgroud)