Может ли numpy.rint вернуть Int32? - PullRequest
1 голос
/ 13 марта 2019

Я делаю

ret = np.rint(y * 4)
return ret

И я хочу, чтобы он вернулся Int32.Я попытался добавить dtype='Int32', но с ошибкой сказал: TypeError: No loop matching the specified signature and casting was found for ufunc rint

Я прошу прощения, если это основной вопрос, но я попытался найти ответ безрезультатно

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Вы можете использовать метод astype ( документы здесь )

ret = np.rint(y * 4).astype(np.int32)

Обратите внимание, что astype создает копию, поэтому она может быть не самой эффективной операцией с памятью (в большинстве случаев вам все равно).

sidenote: Почему rint выводит массив целых чисел float dtype, мне не хватает.

1 голос
/ 13 марта 2019

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'
0 голосов
/ 13 марта 2019

Похоже, что это сделает это:

ret = (y * 4)
ret = ret.astype(int)
return ret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...