Кажется непоследовательным RuntimeWarning с использованием numpy arange - PullRequest
1 голос
/ 27 мая 2020

Когда мой друг запускает следующий код, он выдает RuntimeWarning и возвращает «inf». Однако, если я запускаю этот же код, он выполняется без предупреждения и возвращает значение.

import numpy as np
total = 0
k = 10**6
arr = np.arange(k, 0, -1)
for i in arr:
    total += 1/(i**2)
print(total)

Это ее результат:

\Anaconda3\lib\site-packages\ipykernel_launcher.py:7: RuntimeWarning: divide by zero encountered in long_scalars
  import sys
inf

Замена np.arange () на встроенный range () решает проблему, и она получает тот же результат, что и я.

Мой вопрос: что вызывает это несоответствие между ее результатами и моими? Кроме того, почему она видит разницу при использовании np.arange vs range, в то время как для меня результат такой же?

Мы оба используем python 3.7.4 через Anaconda и numpy 1.16.5 на 64-битной Windows 10.

1 Ответ

2 голосов
/ 27 мая 2020

Это связано с тем, какой тип данных Numpy выводит при создании arr. Для меня Numpy предположил, что я хотел np.int32, и этого просто недостаточно, чтобы вместить (10 ** 6) ** 2, поэтому вы получите значение inf.

Если вы явно объявите тип данных как, скажем, np.float64 проблема разрешится сама собой.

arr = np.arange(k, 0, -1, dtype=np.float64)
...