`AttributeError: rint` при использовании numpy.round
У меня есть массив numpy, который выглядит так:
[[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)
Я что-то делаю неправильно? Есть ли другой способ сделать это эффективно для большого массива?
Ответы
Ответ 1
Вы не можете объединять массивы numpy, которые являются объектами, это можно изменить с помощью astype
, пока ваш массив можно безопасно преобразовать в float:
>>> 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])
Вы получите похожие ошибки с массивами типов string, unicode, void и char.
Ответ 2
Вы можете сделать что-то вроде этого:
numbers=[22.2,99.123,1213.1230]
newnumbers=[]
for n in numbers:
newnumbers.append(round(n))
#for comparison
print numbers
print newnumbers
Ответ 3
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]])
Однако обратите внимание, что он не работает на длинах python. Фактически это дает ту же ошибку, о которой вы сообщали:
>>> 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 не может преобразовать некоторые из чисел в вашем списке python в один из его типов данных. Если это долго, тогда это не проблема, потому что она уже закруглена, но вам придется обойти ее.