2013-10-15 3 views
13

Ich habe eine numpy Array, das wie folgt aussieht:`Attribute: rint` wenn numpy.round mit

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

Ich mag die Zahlen im Array auf zwei Dezimalstellen runden, oder drei. Ich habe versucht, mit numpy.around und numpy.round, aber beide geben mir die folgende Fehlermeldung:

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 

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

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

+0

Schreiben Sie eine Funktion, die mit 100 multipliziert (oder 1000), Runden, dann durch 100 (oder 1000) –

+0

Running Python 2.7 auf meinem Computer Ihren Code hat gut funktioniert. Können Sie ein vollständigeres Beispiel für den Fehler geben, den Sie erleben? – mdml

+0

das Array hat zwei Spalten und etwa 500k Zeilen. Ich habe nichts extra getan –

Antwort

15

Sie können nicht rund numpy Arrays, die Objekte sind, kann dies so lange mit astype geändert werden, wie das Array Schwimmer sicher umgesetzt werden können:

>>> 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 ähnliche Fehler mit Zeichenfolge erhalten, Unicode, lücke, und char-Typ-Arrays.

+1

Was das OP tun soll, ist das Argument "dtype = float" hinzuzufügen, wenn sie das Array erstellen. – SethMMorton

+0

@SethMMorton Es gibt offensichtlich einen Grund, warum das Array als Objekt statt Float umgewandelt wird. Ich würde nur zögerlich vorschlagen, die Gesamtdptypen zu ändern, ohne mehr vom OP-Code zu verstehen. – Daniel

+0

Ich bin mir nicht sicher, dass es einen klaren Grund gab ... es könnte ein Fehler gewesen sein. Wir wissen nicht, wie das Array erstellt wurde. Wenn es einen Grund gab, stimme ich dir zu. Ich habe das nur vorgeschlagen, falls das OP es nicht wissen sollte. – SethMMorton

0

Man könnte 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

ich habe eine 2-D-array mit rund 500k reihen und ich möchte auf eine bestimmte anzahl von dezimalstellen runden, nicht komplett um sie alle –

+0

Dies war nur ein Vorschlag, könnten Sie nicht ersetzen Runde (n) mit numpy.around()? –

0

numpy.around sollte auf einer Liste von Listen arbeiten:

>>> 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 nicht auf Python longs funktioniert. In der Tat gibt es den gleichen Fehler, den Sie berichtet:

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

Was ist passiert zu sein scheint, dass numpy nicht einige der Zahlen in Ihrer Python-Liste zu einem seiner Datentypen umwandeln kann. Wenn es lang ist, ist es kein Problem, weil es bereits abgerundet ist, aber Sie müssen es umgehen.

Verwandte Themen