Из базовых numpy :
При работе с массивами разных типов тип результирующего массива соответствует более общему или точному (поведение, известное какupcasting).
Вы можете определить тип данных при создании массива.Применяя сумму, умножение или вычитание, результат будет преобразован в «больший» тип, он также сохранит dtype, если вы выполните операции с массивом, например:
x = np.ones(10, dtype=np.float16)
y = np.ones(10, dtype=np.float32)
print((x + y).dtype, (x - y).dtype, (x * y).dtype)
print(np.sin(x).dtype, np.sin(y).dtype)
>> float32 float32 float32
float16 float32
Исключение составляет передача целого числа.в этом случае по умолчанию numpy повышается до float64
print(np.sin(np.ones(10, dtype=int)).dtype)
>> float64