Целочисленное переполнение в массивах numpy

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]]
8
задан sastanin 28 December 2009 в 18:29
поделиться

2 ответа

На Вашей платформе 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.

.
18
ответ дан 5 December 2019 в 06:37
поделиться

целочисленные типы numpy имеют фиксированную ширину, и вы видите результат целочисленного переполнения.

.
2
ответ дан 5 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: