I'm doing
ret = np.rint(y * 4)
return ret
And I want it to return Int32
. I tried adding dtype='Int32'
, but it errors saying: TypeError: No loop matching the specified signature and casting was found for ufunc rint
I apologize if this is a basic question, but I tried to search for an answer to no avail
ufuncs
have specific rules of what kinds of output they produce given the input. For rint
the rules are:
In [41]: np.rint.types
Out[41]: ['e->e', 'f->f', 'd->d', 'g->g', 'F->F', 'D->D', 'G->G', 'O->O']
On top of that there are rules about what dtypes can be cast to other dtypes. We can play with the out
and the casting
parameters to produce an integer output, but simply using astype
after is simpler.
So rint
normally returns a matching float, even though the values are rounded.
In [43]: np.rint(np.linspace(0,10,8))
Out[43]: array([ 0., 1., 3., 4., 6., 7., 9., 10.])
Simply providing an int out
doesn't work:
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''
We have to give it permission to do a float to int casting:
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])
The default casting
for astype
is 'unsafe'.
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'
You can use the astype
method (docs here)
ret = np.rint(y * 4).astype(np.int32)
Note that astype
creates a copy, so it may be not the most efficient memory operation (most times you wont care).
sidenote: Why rint
outputs a float
dtype array of integers is beyond me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With