import numpy as np
a = np.arange(1000000).reshape(1000,1000)
print(a**2)
С этим кодом я получаю этот ответ. Почему я получаю отрицательные величины?
[[ 0 1 4 ..., 994009 996004 998001]
[ 1000000 1002001 1004004 ..., 3988009 3992004 3996001]
[ 4000000 4004001 4008004 ..., 8982009 8988004 8994001]
...,
[1871554624 1873548625 1875542628 ..., -434400663 -432404668 -430408671]
[-428412672 -426416671 -424420668 ..., 1562593337 1564591332 1566589329]
[1568587328 1570585329 1572583332 ..., -733379959 -731379964 -729379967]]
На Вашей платформе np.arange возвращает массив типа dtype 'int32' :
In [1]: np.arange(1000000).dtype
Out[1]: dtype('int32')
Каждый элемент массива представляет собой 32-битное целое число. Квадратное разделение приводит к результату, который не помещается в 32 бита. Однако результат обрезается до 32 бит и по-прежнему интерпретируется как 32-битное целое число, поэтому вы видите отрицательные числа.
Edit: В этом случае вы можете избежать целочисленного переполнения, построив массив dtype 'int64' перед квадратом:
a=np.arange(1000000,dtype='int64').reshape(1000,1000)
Обратите внимание, что обнаруженная вами проблема представляет собой внутреннюю опасность при работе с Numpy. Вы должны внимательно подбирать типы и заранее знать, что ваш код не приведет к арифметическим переполнениям. Ради скорости, numpy не может и не предупредит вас, когда это произойдет.
Смотрите http://mail.scipy.org/pipermail/numpy-discussion/2009-April/041691.html для обсуждения этого в списке рассылки numpy.
.целочисленные типы numpy имеют фиксированную ширину, и вы видите результат целочисленного переполнения.
.