关于NumPy数据类型的两个技术疑问:等价性与元素类型差异
NumPy数据类型问题解答
问题1:np.str_与np.dtype('U')的关系
你观察到以下现象:
import numpy as np np.str_ == np.dtype('U') # 返回 True id(np.str_) == id(np.dtype('U')) # 返回 False
两者是同一逻辑类型的不同获取方式,无功能差异:
np.str_是NumPy预定义的Unicode字符串类型别名,直接指向该类型的dtype对象np.dtype('U')是通过类型描述符字符串'U'创建的该类型的dtype实例- NumPy对dtype的
==比较是基于类型的核心属性(如编码规则、存储格式),而非对象的内存身份(id)。只要类型逻辑一致,即使是不同实例也会返回True - 实际使用中两者完全等价,都指代NumPy的Unicode字符串类型
问题2:'d'与'g' dtype数组的元素类型差异
你执行以下代码:
import numpy as np a = np.array([1,2,3],dtype='d') b = np.array([1,2,3],dtype='g')
得到数组dtype相同,但元素类型不同:
a.dtype # dtype('float64') b.dtype # dtype('float64') type(a[0]) # <class 'numpy.float64'> type(b[0]) # <class 'numpy.longdouble'>
原因说明
dtype描述符的语义差异:
'd'是np.float64(IEEE 64位双精度浮点)的明确别名,数组直接创建为float64类型,提取元素时返回对应标量类型'g'是通用扩展精度浮点的描述符,语义上指向np.longdouble,但受平台限制:- 在多数Windows平台或特定编译配置下,
longdouble的存储格式与float64完全兼容(无额外精度),NumPy无法创建独立的longdouble数组,只能降级为float64数组存储 - 但标量层面仍返回
np.longdouble类型,这是因为'g'的原始语义是请求扩展精度,即使数组存储降级,标量类型仍保留对应的接口
- 在多数Windows平台或特定编译配置下,
元素类型的具体差异:
np.float64:固定为IEEE 64位双精度,跨平台行为一致np.longdouble:平台相关,在x86_64 Linux上是80位扩展精度(精度高于float64),但在你的测试平台上它与float64存储完全相同,仅类型标识不同,实际计算无差异
内容的提问来源于stack exchange,提问作者P.Jo
相关产品推荐
相关产品推荐

