web-dev-qa-db-de.com

`AttributeError: rint` bei Verwendung von numpy.round

Ich habe ein numpy Array, das so aussieht:

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

Ich möchte die Zahlen im Array auf zwei oder drei Dezimalstellen runden. Ich habe versucht, numpy.around und numpy.round zu verwenden, aber beide geben mir den folgenden Fehler:

  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

ich habe numpy.around(x, decimals = 2) und numpy.round(x,decimals=2) verwendet

Mache ich etwas falsch? Gibt es eine andere Möglichkeit, dies für ein großes Array effizient durchzuführen?

22
Abhishek Thakur

Sie können numpy-Arrays nicht runden, die Objekte sind. Dies kann mit astype geändert werden, sofern Ihr Array sicher in Floats konvertiert werden kann:

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

Sie erhalten ähnliche Fehler mit Arrays vom Typ String, Unicode, Void und Char.

27
Daniel

Sie könnten so etwas tun:

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 sollte auf einer Liste von Listen funktionieren:

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

Beachten Sie jedoch, dass es bei Python-Longs nicht funktioniert. In der Tat gibt es den gleichen Fehler, den Sie gemeldet haben:

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

Es scheint so, als ob numpy einige der Zahlen in Ihrer Python-Liste nicht in einen ihrer Datentypen konvertieren kann. Wenn es lang ist, ist es kein Problem, da es bereits abgerundet ist, aber Sie müssen es umgehen.

0
Claudiu