4

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

4

2 回答 2

6

您可以丢弃底部的 16 位:

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

这会给你这个:

array([ 485, 1054, 2531], dtype=int16
于 2019-04-02T13:17:17.117 回答
1

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

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

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

因此,额外的要求casting='safe'将导致 a 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'

于 2019-04-02T12:05:58.803 回答