【问题标题】:How to round a numpy array?如何舍入一个numpy数组?
【发布时间】:2017-10-28 20:59:27
【问题描述】:

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

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

我想将每个元素四舍五入到小数点后两位。

我该怎么做?

【问题讨论】:

  • np.round(data,2)?
  • 您的示例运行良好。 “不起作用”是什么意思?
  • np.round 等同于 np.around 并且都适用于整个数组。
  • 您究竟希望四舍五入的输出是什么?
  • 我想他应该说如何将小数点后的数字1.60130719e-01 减少到1.60

标签: python arrays numpy rounding


【解决方案1】:

Numpy 提供了两种相同的方法来执行此操作。要么使用

np.round(data, 2)

np.around(data, 2)

因为它们是等价的。

更多信息请参见the documentation


例子:

>>> 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])

【讨论】:

  • 数组不是 np 数组,像 np.array 一样导入后它的工作
  • 也可作为方法round(): a.round(decimals=2)
【解决方案2】:

如果你希望输出是

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

【讨论】:

  • 这或多或少是我想要的。使用 np.around 而不是 round 将使其也适用于多维数组。
【解决方案3】:

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

>>> 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 数据类型的精度。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2012-08-12
    • 2019-07-17
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多