web-dev-qa-db-fra.com

`AttributeError: rint` lors de l'utilisation de numpy.round

J'ai un tableau numpy qui ressemble à ceci:

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

Je veux arrondir les nombres du tableau à deux décimales, ou trois. J'ai essayé d'utiliser numpy.around et numpy.round, mais les deux me donnent l'erreur suivante:

  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

j'ai utilisé numpy.around(x, decimals = 2) et numpy.round(x,decimals=2)

Est-ce que je fais quelque chose de mal? Existe-t-il un autre moyen de le faire efficacement pour un grand nombre?

22
Abhishek Thakur

Vous ne pouvez pas arrondir les tableaux numpy qui sont des objets, cela peut être changé avec astype tant que votre tableau peut être converti en toute sécurité en floats:

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

Vous recevrez des erreurs similaires avec des tableaux de types string, unicode, void et char.

27
Daniel

Vous pouvez faire quelque chose comme ça:

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

numpy.around devrait travailler sur une liste de listes:

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

Cependant, notez que cela ne fonctionne pas sur les python longs. En fait, cela donne la même erreur que vous avez signalée:

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

Ce qui semble se produire, c'est que numpy ne peut pas convertir certains des nombres de votre liste python en l'un de ses types de données. Si c'est long, alors ce n'est pas un problème parce que c'est déjà arrondi, mais vous devrez contourner le problème.

0
Claudiu