Python `AttributeError:rint`使用numpy.round时

Python `AttributeError:rint`使用numpy.round时,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组,看起来像这样: [[41.743617 -87.626839] [41.936943 -87.669838] [41.962665 -87.65571899999999]] numbers=[22.2,99.123,1213.1230] newnumbers=[] for n in numbers: newnumbers.append(round(n)) #for comparison print numbers print newnumbers 我想把

我有一个numpy数组,看起来像这样:

[[41.743617 -87.626839]
 [41.936943 -87.669838]
 [41.962665 -87.65571899999999]]
numbers=[22.2,99.123,1213.1230]
newnumbers=[]
for n in numbers:
    newnumbers.append(round(n))
#for comparison
print numbers
print newnumbers 
我想把数组中的数字四舍五入到小数点后两位或三位。我尝试使用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,小数=2)
numpy.round(x,小数=2)


我做错什么了吗?对于大型阵列,还有其他有效的方法吗?

您可以这样做:

[[41.743617 -87.626839]
 [41.936943 -87.669838]
 [41.962665 -87.65571899999999]]
numbers=[22.2,99.123,1213.1230]
newnumbers=[]
for n in numbers:
    newnumbers.append(round(n))
#for comparison
print numbers
print newnumbers 

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 long。事实上,它给出了与您报告的相同的错误:

>>> 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
np.圆形(38924389428934892348899848939) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/Users/csaftoiu/work/venv/lib/python2.7/site-packages/numpy/core/fromneric.py”,第2401行,整轮_ 返回(a,‘四舍五入’、小数、out) 文件“/Users/csaftoiu/work/venv/lib/python2.7/site packages/numpy/core/fromneric.py”,第38行,在包装中 结果=getattr(asarray(obj),方法)(*args,**kwds) 属性错误:rint
似乎正在发生的事情是,numpy无法将python列表中的一些数字转换为它的数据类型之一。如果是长数组,则这不是问题,因为它已经被舍入,但您必须解决它。

您不能舍入作为对象的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])
>a=np.random.rand(5).astype(np.object)
>>>a
阵列([0.513725055772075,0.4279757819721647,0.4177118178603122,
0.6270676923544128,0.437332183290947],数据类型=对象)
>>>np.关于(a,3)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/numpy/core/fromneric.py”,第2384行,大约
返回四舍五入(小数,out)
属性错误:rint
>>>np.around(a.astype(np.double),3)
阵列([0.514,0.428,0.418,0.627,0.437])

字符串、unicode、void和char类型数组也会出现类似的错误。

在我的机器上运行Python 2.7,编写一个乘以100(或1000)、舍入、然后除以100(或1000)的函数。您的代码运行良好。你能举一个更完整的例子说明你遇到的错误吗?这个数组有两列,大约500k行。我没有做任何额外的事情,你发布的数据结构是一个列表列表,而不是numpy数组。当你打印你的数组时,你能发布实际打印的内容吗?这将有助于我们理解数组的
dtype
。数组的dtype是“object”。我有一个大约500k行的二维数组,我想将它们四舍五入到特定的小数位数,而不是完全四舍五入。这只是一个建议,您能不能用numpy.around()代替round(n)?OP应该做的是在创建数组时添加
dtype=float
参数。@SethMMorton数组被强制转换为对象而不是float显然是有原因的。我会犹豫是否建议在不了解OP代码的情况下更改总体数据类型。我不确定是否有明显的原因。。。这可能是个错误。我们不知道数组是如何创建的。如果有原因的话,我同意你。我只是想说一下,以防OP不知道。@SethMMorton这是一个足够公平的观点,我可能有点谨小慎微,当谈到附加到SO声明的免责声明时。这解决了我的问题。我不知道如何处理numpy对象