2013-10-15 4 views
13

У меня есть Numpy массив, который выглядит следующим образом:`AttributeError: rint` при использовании numpy.round

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

Я хочу, чтобы округлить число в массиве до двух знаков после запятой, или три. Я попытался с помощью 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, decimals = 2) и numpy.round(x,decimals=2)

Я делаю что-то не так? Есть ли другой способ сделать это эффективно для большого массива?

+0

написать функцию, которая умножает на 100 (или 1000), раундов, а затем делит на 100 (или 1000) –

+0

Запуск Python 2.7 на моем компьютере ваш код работал нормально. Можете ли вы привести более полный пример ошибки, которую вы испытываете? – mdml

+0

массив имеет два столбца и около 500 тыс. Строк. Я ничего не сделал –

ответ

15

Вы можете не круглые массивы 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]) 

Вы получите подобные ошибки шпагата, Unicode, недействительным, и массивы типа char.

+1

Что должен сделать OP, это добавить аргумент 'dtype = float', когда они создадут массив. – SethMMorton

+0

@SethMMorton Понятно, что массив используется как объект вместо float. Я бы не решался предлагать изменение общих типов, не понимая больше кода OP. – Daniel

+0

Я не уверен, что была определенная причина ... это могло быть ошибкой. Мы не знаем, как был создан массив. Если есть причина, я согласен с вами. Я просто предлагал это в случае, если ОП не знал. – SethMMorton

0

Вы могли бы сделать что-то вроде этого:

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

У меня есть 2-мерный массив размером около 500 тыс. Строк, и я хочу округлить до определенного количества знаков после запятой, а не полностью вокруг них всех –

+0

Это было всего лишь предложение, не могли бы вы заменить round (n) с numpy.around()? –

0

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

Однако, обратите внимание, что он не работает на питона долгот. На самом деле это дает ту же ошибку, вы сообщили:

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

То, что кажется, происходит то, что NumPy не может преобразовать некоторые из чисел в списке питона одному из своих типов данных. Если это долго, тогда это не проблема, потому что она уже закруглена, но вам придется ее обойти.

Смежные вопросы