我想将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)
变成一个零数组。我不知道我在做什么错。有人可以帮我吗?
答案 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