int16和in32 dtype有什么区别

时间:2017-05-06 05:31:40

标签: python numpy ipython

必需:numpy

b = np.arange(10, dtype = 'int16')
print(b)  #prints [0 1 2 3 4 5 6 7 8 9]
a = b.view(dtype = 'int32')
print(a) #prints [ 65536 196610 327684 458758 589832] #notice also the space before the first element

有人可以解释发生了什么 g将dtype转换为'int32'。我一直以为'int16'到'int32'意味着分配的位数会改变,但是显然我不理解它

2 个答案:

答案 0 :(得分:2)

参考:Numpy中的Array types和ndarray.view doc

  

a.view(dtype = some_dtype)使用不同的数据类型构造数组内存的视图。这可能会导致重新解释内存字节。

  1. 考虑b = np.arange(10, dtype = 'int16')
    它生成一个从0到9的均匀间隔的数组。[0 1 2 3 4 5 6 7 8 9]

    1.1将此数组视为int32将数组合并为(32/16) = 2 此外,尝试在奇数长度数组上执行此操作将导致错误。

    输出为[ 65536 196610 327684 458758 589832]
    说明:[ 65536 * 1 + 0, 65536 * 3 + 2, 65536 * 5 + 4, 65536 * 7 + 6, 65536 * 9 + 8]

  2. 考虑b = np.arange(10, dtype = 'int32')
    它等于np.arange(10),它简单地创建一个从0到9的均匀间隔的数组。

    2.1以int16的形式查看此数据会将数据中的每个元素拆分为(32/16) = 2部分 因此,a = b.view(dtype = 'int16')[0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0]

    2.2以int8的形式查看此数据会将数据中的每个元素拆分为(32/8) = 4部分 因此,a = b.view(dtype = 'int8')[0 0 0 0 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 0 0 0 7 0 0 0 8 0 0 0 9 0 0 0]

答案 1 :(得分:1)

正如您所说,它是用于表示每个整数的位数,但请考虑当您尝试将10 int16个单词打印为int32个字时会发生什么。每个int32字词将由两个int16字构成。因此,如您所见,只会有int32个单词。

此外,32位整数的字节顺序是这样的,即前16位字将是LSB位。从而查看你的两个第一个单词的十六进制表示。在16位中,它们是:0x0000 = 00x0001 = 1。当在32位字中使用相同的位时,由于这种有点不直观的位顺序,会得到0x0001 0000 = 65536

我希望这有助于您理解这些概念。

相关问题