Как преобразовать массив NumPy Int32 в массив NumPy Int16? - PullRequest
0 голосов
/ 02 апреля 2019

Я хочу связать массив numpy от типа int32 до типа int16 .

У меня есть массив int32 с именем array_int32, и я преобразую его в int16.

import numpy as np
array_int32 = np.array([31784960, 69074944, 165871616])`
array_int16 = array_int32.astype(np.int16)

После преобразования array_int16 превращается в массив нулей.Я не знаю, какую ошибку я делаю.Может ли кто-нибудь помочь мне в этом?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете отбросить 16 младших битов:

n=(array_int32>>16).astype(np.int16)                          

, что даст вам следующее:

array([ 485, 1054, 2531], dtype=int16
1 голос
/ 02 апреля 2019

Числа в вашем 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'

...