在numpy文档中输入i4和S8的升级规则

sy5wg1nm  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(96)

我在numpydoc上看到了这个例子:

np.promote_types('i4', 'S8')
dtype('S11')

基本上,我不能理解以下内容:
i4占用4字节,S8占用8字节。那么,为什么-在内存方面-我需要一个S11来容纳这两种类型?我希望S8是结果。

csga3l58

csga3l581#

S8是字符串。因此,当选择一个dtype来同时容纳i4和S8时,需要考虑的相关情况是将i4中可能的最长数字表示为字符串。
要将-2,147,483,648表示为字符串,需要11个字符。这就是为什么结果是S11。

ni65a41a

ni65a41a2#

“查看”与“i4”和“S8”相同的位模式的示例是:

In [213]: np.array([1,2,3,4], dtype='i4').view('S8')
Out[213]: array([b'\x01\x00\x00\x00\x02', b'\x03\x00\x00\x00\x04'], dtype='|S8')

4*4=16的数据缓冲区可以看作是两个“S8”
当我们尝试从整数数组和字符串1创建一个新数组时,例如使用concatenate,就会发生转换/类型提升:

In [214]: np.hstack([np.array([1],'i4'),np.array(['testings'],dtype='S8')])
Out[214]: array([b'1', b'testings'], dtype='|S11')

或者使用默认的unicode字符串格式:

In [215]: np.array([1, 'testings'])
Out[215]: array(['1', 'testings'], dtype='<U11')

相关问题