Сумма Python не возвращает тот же результат, что и NumPy 'numpy .sum - PullRequest
5 голосов
/ 18 февраля 2020
Функция суммирования

Numpy возвращает правильный ожидаемый результат, но сумма по умолчанию python не равна (по крайней мере, для типа данных uint8, что делает его еще более запутанным):

In [1]: import numpy as np                                                      

In [2]: x = np.random.randint(2, size = (1000,100))                             

In [3]: x                                                                       
Out[3]: 
array([[1, 1, 0, ..., 0, 1, 1],
       [1, 1, 1, ..., 0, 0, 0],
       [1, 1, 0, ..., 1, 0, 1],
       ...,
       [1, 0, 0, ..., 1, 0, 1],
       [0, 0, 1, ..., 0, 1, 1],
       [1, 1, 0, ..., 1, 1, 1]])

In [4]: np.sum(x)                                                               
Out[4]: 50318

In [5]: sum(sum(x))                                                             
Out[5]: 50318

In [6]: x = x.astype('uint8')                                                   

In [7]: np.sum(x)                                                               
Out[7]: 50318

In [8]: sum(sum(x))                                                             
Out[8]: 16014

1 Ответ

3 голосов
/ 18 февраля 2020

Указывая uint8, вы указываете numpy использовать 8 бит на элемент. Максимальное число, которое можно сохранить в 8 битах, равно 255. Поэтому при суммировании вы получаете переполнение.
Практический пример:

>>> arr = np.array([[255],[1]],dtype=np.uint8)
>>> arr
array([[255],
       [1]], dtype=uint8)
>>> sum(arr)
array([0], dtype=uint8)
>> arr[0]+arr[1]
array([0], dtype=uint8)

Обратите внимание, что sum(arr) соответствует arr[0] + arr[1] в этом дело. Как указано в документации:

Arithmeti c является модульным при использовании целочисленных типов, и при переполнении не возникает ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...