必需: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'意味着分配的位数会改变,但是显然我不理解它
答案 0 :(得分:2)
参考:Numpy中的Array types和ndarray.view doc
a.view(dtype = some_dtype)使用不同的数据类型构造数组内存的视图。这可能会导致重新解释内存字节。
考虑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]
考虑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 = 0
和0x0001 = 1
。当在32位字中使用相同的位时,由于这种有点不直观的位顺序,会得到0x0001 0000 = 65536
。
我希望这有助于您理解这些概念。