如何圆numpy数组?

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 数据类型的全部多功能性并保持其精度。

另请注意,这仅影响打印,而不影响用于计算的存储值的实际精度。


jmd*_*_dk 7

如果您希望输出为

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)

  • 这或多或少是我想要的。使用 `np.around` 而不是 `round` 也将使其适用于多维数组。 (2认同)