ufuncs
имеют конкретные правила того, какие виды продукции они производят с учетом ввода.Для rint
действуют следующие правила:
In [41]: np.rint.types
Out[41]: ['e->e', 'f->f', 'd->d', 'g->g', 'F->F', 'D->D', 'G->G', 'O->O']
Кроме того, существуют правила о том, какие типы dtypes можно привести к другим типам dtypes.Мы можем поиграть с параметрами out
и casting
, чтобы получить целочисленный вывод, но просто использовать astype
после проще.
Так что rint
обычно возвращает совпадающее число с плавающей точкой, даже если значения* округлены.
In [43]: np.rint(np.linspace(0,10,8))
Out[43]: array([ 0., 1., 3., 4., 6., 7., 9., 10.])
Простое предоставление int out
не работает:
In [44]: np.rint(np.linspace(0,10,8),out=np.zeros(8,int))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-44-e7f13fa29434> in <module>
----> 1 np.rint(np.linspace(0,10,8),out=np.zeros(8,int))
TypeError: ufunc 'rint' output (typecode 'd') could not be coerced to provided output parameter (typecode 'l') according to the casting rule ''same_kind''
Мы должны дать ему разрешение сделать float для int cast:
In [45]: np.rint(np.linspace(0,10,8),out=np.zeros(8,int),casting='unsafe')
Out[45]: array([ 0, 1, 3, 4, 6, 7, 9, 10])
По умолчанию casting
для astype
является «небезопасным».
In [55]: np.rint(np.linspace(0,10,8)).astype(int,casting='safe')
TypeError: Cannot cast array from dtype('float64') to dtype('int64') according to the rule 'safe'