Integer overflow in numpy arrays

前端 未结 4 610
执笔经年
执笔经年 2020-11-30 12:37
import numpy as np
a = np.arange(1000000).reshape(1000,1000)
print(a**2)

With this code I get this answer. Why do I get negative values?

         


        
4条回答
  •  日久生厌
    2020-11-30 13:15

    On your platform, np.arange returns an array of dtype 'int32' :

    In [1]: np.arange(1000000).dtype
    Out[1]: dtype('int32')
    

    Each element of the array is a 32-bit integer. Squaring leads to a result which does not fit in 32-bits. The result is cropped to 32-bits and still interpreted as a 32-bit integer, however, which is why you see negative numbers.

    Edit: In this case, you can avoid the integer overflow by constructing an array of dtype 'int64' before squaring:

    a=np.arange(1000000,dtype='int64').reshape(1000,1000)
    

    Note that the problem you've discovered is an inherent danger when working with numpy. You have to choose your dtypes with care and know before-hand that your code will not lead to arithmetic overflows. For the sake of speed, numpy can not and will not warn you when this occurs.

    See http://mail.scipy.org/pipermail/numpy-discussion/2009-April/041691.html for a discussion of this on the numpy mailing list.

提交回复
热议问题