【问题标题】:`AttributeError: rint` when using numpy.round使用 numpy.round 时的 `AttributeError: rint`
【发布时间】:2013-10-23 15:13:29
【问题描述】:

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

[[41.743617 -87.626839]
 [41.936943 -87.669838]
 [41.962665 -87.65571899999999]]

我想将数组中的数字四舍五入到小数点后两位或三位。我尝试使用 numpy.around 和 numpy.round,但它们都给了我以下错误:

  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_3084618_20130514-py2.7-macosx-10.8-intel.egg/numpy/core/fromnumeric.py", line 2452, in round_
    return round(decimals, out)
AttributeError: rint

我用过numpy.around(x, decimals = 2)numpy.round(x,decimals=2)

我做错了吗?对于大型数组,还有其他方法可以有效地做到这一点吗?

【问题讨论】:

  • 编写一个函数,乘以 100(或 1000),四舍五入,然后除以 100(或 1000)
  • 在我的机器上运行 Python 2.7,您的代码运行良好。你能举一个更完整的例子来说明你遇到的错误吗?
  • 该数组有两列和大约 500k 行。我没有做任何额外的事情
  • 您发布的数据结构是列表列表,而不是 numpy 数组。您可以发布print your_array 时实际打印的内容吗?这将有助于我们理解数组的dtype
  • 数组的dtype是"object"

标签: python arrays numpy


【解决方案1】:

您不能对作为对象的 numpy 数组进行四舍五入,只要您的数组可以安全地转换为浮点数,就可以使用 astype 进行更改:

>>> a = np.random.rand(5).astype(np.object)
>>> a
array([0.5137250555772075, 0.4279757819721647, 0.4177118178603122,
       0.6270676923544128, 0.43733218329094947], dtype=object)

>>> np.around(a,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2384, in around
    return round(decimals, out)
AttributeError: rint

>>> np.around(a.astype(np.double),3)
array([ 0.514,  0.428,  0.418,  0.627,  0.437])

对于字符串、unicode、void 和 char 类型的数组,您会收到类似的错误。

【讨论】:

  • OP 应该做的是在创建数组时添加dtype=float 参数。
  • @SethMMorton 数组被转换为对象而不是浮点数显然是有原因的。在不了解更多 OP 代码的情况下,我会犹豫是否建议更改整体 dtype。
  • 我不确定是否有明确的原因......这可能是一个错误。我们不知道数组是如何创建的。如果有理由,我同意你的看法。我只是建议这样做,以防 OP 不知道。
  • @SethMMorton 这是一个很公平的观点,当涉及到 SO 声明所附的免责声明时,我可能有点过于谨慎了。
  • 这解决了我的问题。我不知道如何处理 numpy 对象
【解决方案2】:

你可以这样做:

numbers=[22.2,99.123,1213.1230]
newnumbers=[]
for n in numbers:
    newnumbers.append(round(n))
#for comparison
print numbers
print newnumbers 

【讨论】:

  • 我有一个大约 500k 行的二维数组,我想四舍五入到特定的小数位数,而不是完全四舍五入
  • 这只是一个建议,你能不能用 numpy.around() 代替 round(n) 吗?
【解决方案3】:

numpy.around 应该适用于列表列表:

>>> import numpy as np
>>> arr = [[41.743617, -87.626839],
           [41.936943, -87.669838],
           [41.962665, -87.65571899999999]]
>>>
>>> np.around(arr, decimals=2)
array([[ 41.74, -87.63],
       [ 41.94, -87.67],
       [ 41.96, -87.66]])
>>> np.round(arr, decimals=2)
array([[ 41.74, -87.63],
       [ 41.94, -87.67],
       [ 41.96, -87.66]])

但是,请注意它不适用于 python longs。事实上,它给出了您报告的相同错误:

>>> np.round(3892438942893489234899848939)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/csaftoiu/work/venv/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2401, in round_
    return _wrapit(a, 'round', decimals, out)
  File "/Users/csaftoiu/work/venv/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 38, in _wrapit
    result = getattr(asarray(obj),method)(*args, **kwds)
AttributeError: rint

似乎正在发生的事情是 numpy 无法将 python 列表中的某些数字转换为其一种数据类型。如果它很长,那么这不是问题,因为它已经是四舍五入了,但是您必须解决它。

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 2017-12-14
    • 1970-01-01
    • 2013-02-01
    • 2019-02-16
    • 2016-06-04
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多