Почему np.vectorize(function) избегает целочисленного переполнения, с которым сталкивается сама функция, если она не обеPython

Программы на Python
Anonymous
Почему np.vectorize(function) избегает целочисленного переполнения, с которым сталкивается сама функция, если она не обе

Сообщение Anonymous »

Я знаю, что 1,0 * (40-80) дает -40,0. Я это понимаю

Код: Выделить всё

1.0 * (np.array([np.uint8(40)])-80)
результат будет виде массива([216.]). Так что тоже неудивительно, что:

Код: Выделить всё

import numpy as np

C = 1.0

def f(x):
return C * (x - 80)

print(f(np.array([np.uint8(40)])))
выходы [216.]. Однако еще более удивительно то, что

Код: Выделить всё

print(np.vectorize(f)(np.array([np.uint8(40)])))
выходы:

Код: Выделить всё

[-40.]
/var/folders/jz/34xs15sd3ng6dpxkv78hh1lr0000gn/T/ipykernel_61208/1067934613.py:7: RuntimeWarning: overflow encountered in scalar subtract
return C * (x - 80)
Основываясь на этой теме, я могу предположить, что происходит то, что f вызывается один раз, чтобы определить тип выходных данных, происходит переполнение (отсюда и предупреждение). Тип выходных данных определяется как np.float64. f вызывается снова, на этот раз для определения фактического результата, и мы получаем [-40.]. Кажется, что каким-то образом ввод np.uint8(40) преобразуется в np.float64, и только затем вычитается 80, поэтому мы получаем -40 вместо 216.
Я ожидал бы того же результата, если бы вручную указывал тип данных вывода. Итак, это:

Код: Выделить всё

print(np.vectorize(f,otypes=[np.float64])([np.uint8(40)]))
Я надеюсь, что, согласно приведенным выше рассуждениям, получится [-40.]. Тип выходных данных уже известен (

Код: Выделить всё

np.float64
), превратите входные данные в np.float64, вычтите 80, умножьте на 1,0, верните -40. Однако я получаю:

Код: Выделить всё

[216.]
/var/folders/jz/34xs15sd3ng6dpxkv78hh1lr0000gn/T/ipykernel_67644/1868397835.py:7: RuntimeWarning: overflow encountered in scalar subtract
return C * (x - 80)
Поэтому мое мнение о том, что происходит, изложенное выше, неверно.
Почему print(np.vectorize(f)(np.array([np.uint8(40)]))) избегает целочисленного переполнения, которое print(f(np.array([np.uint8(40)]))) и print(np.vectorize(f,otypes=[np.float64])([np.uint8(40)])) не избегайте?

Вернуться в «Python»