Числа в вашем array_int32
слишком велики, чтобы быть представленными 16 битами (целочисленное значение со знаком с 16 битами может представлять только максимальное значение 2 ^ 16-1 = 32767).По-видимому, numpy просто устанавливает результирующие числа в ноль в этом случае.
Это поведение можно изменить, изменив необязательный аргумент casting
astype
Документация состояния
Начиная с NumPy 1.9, метод astype теперь возвращает ошибку, если строка типа dtype для преобразования недостаточно длинна в режиме «безопасного» приведения, чтобы удерживать максимальное значение целочисленного / поплавкового массива, который был приведен.Ранее приведение было разрешено, даже если результат был усечен.
Итак, дополнительное требование casting='safe'
приведет к TypeError
, так как преобразование из 32 (или 64) битов до 16,поскольку максимальное значение исходного типа слишком велико для нового типа, например,
import numpy as np
array_int32 = np.array([31784960, 69074944, 165871616])
array_int16 = array_int32.astype(np.int16, casting='safe')
приводит к
TypeError: Cannot cast array from dtype('int64') to dtype('int16') according to the rule 'safe'