# [Numpy-discussion] aa.astype(int) truncates and doesn't round

Robert Kern robert.kern at gmail.com
Thu Jan 6 12:09:00 EST 2011

On Thu, Jan 6, 2011 at 09:40, Keith Goodman <kwgoodman at gmail.com> wrote:
> On Thu, Jan 6, 2011 at 2:14 AM,  <josef.pktd at gmail.com> wrote:
>> just something I bumped into and wasn't aware of
>>
>>>>> aa
>> array([ 1.,  1.,  1.,  1.,  1.])
>>>>> aa.astype(int)
>> array([0, 1, 0, 0, 0])
>>>>> aa - 1
>> array([ -2.22044605e-16,   2.22044605e-16,  -2.22044605e-16,
>>        -3.33066907e-16,  -3.33066907e-16])
>>>>> np.round(aa).astype(int)
>> array([1, 1, 1, 1, 1])
>
>>> a = np.ones(100)
>>> a.astype(int)
> array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1])
>
> My default numpy int is 64 bits. Try 32 bits:
>
>>> a = np.ones(100, np.int32)
>>> a.astype(int)
>
> array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
>       1, 1, 1, 1, 1, 1, 1, 1])

He's not pointing out a bug. His array does not have 1s in them, but
values very close to 1, some slightly above and some slightly below,
such that numpy's default printing rounds them to 1. See the "aa - 1"
line.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
-- Umberto Eco