我在numpydoc上看到了这个例子:
np.promote_types('i4', 'S8') dtype('S11')
基本上,我不能理解以下内容:i4占用4字节,S8占用8字节。那么,为什么-在内存方面-我需要一个S11来容纳这两种类型?我希望S8是结果。
csga3l581#
S8是字符串。因此,当选择一个dtype来同时容纳i4和S8时,需要考虑的相关情况是将i4中可能的最长数字表示为字符串。要将-2,147,483,648表示为字符串,需要11个字符。这就是为什么结果是S11。
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')
2条答案
按热度按时间csga3l581#
S8是字符串。因此,当选择一个dtype来同时容纳i4和S8时,需要考虑的相关情况是将i4中可能的最长数字表示为字符串。
要将-2,147,483,648表示为字符串,需要11个字符。这就是为什么结果是S11。
ni65a41a2#
“查看”与“i4”和“S8”相同的位模式的示例是:
4*4=16的数据缓冲区可以看作是两个“S8”
当我们尝试从整数数组和字符串1创建一个新数组时,例如使用concatenate,就会发生转换/类型提升:
或者使用默认的unicode字符串格式: