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