如何将int32 numpy数组转换为int16 numpy数组?

时间:2019-04-02 11:46:26

标签: python-3.x numpy bit-depth

我想将numpy数组从 int32 类型转换为 int16 类型。

我有一个名为int32的{​​{1}}数组,我正在将其转换为array_int32

int16

转换后,import numpy as np array_int32 = np.array([31784960, 69074944, 165871616])` array_int16 = array_int32.astype(np.int16) 变成一个零数组。我不知道我在做什么错。有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

array_int32中的数字太大,无法用16位表示(带符号的16位整数只能代表最大值2 ^ 16-1 = 32767)。 显然,在这种情况下,numpy只是将结果数字设置为零。

可以通过更改casting documentation状态的可选astype参数来修改此行为

  

从NumPy 1.9开始,如果要转换的字符串dtype在“安全”转换模式下不够长,无法容纳要转换的整数/浮点数组的最大值,则astype方法现在返回错误。以前,即使结果被截断也可以进行强制转换。

因此,附加要求casting='safe'将导致TypeError,因为原始类型的最大值对于新类型而言从32(或64)位转换为16,因此转换为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'

答案 1 :(得分:1)

您可以舍弃最后16位:

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

这将为您提供:

array([ 485, 1054, 2531], dtype=int16