创建numpy数组时dtype=np.int与原生int的区别是什么
问题原因解释
- 首先
int is np.int返回True是正确结论:从NumPy 1.20版本开始,np.int就被正式设定为Python原生int类型的别名,二者确实为同一个对象,这一步的判断不存在问题。 - 你对
dtype=np.int的生效逻辑存在误解,该参数实际上是正常生效的:
NumPy数组的核心设计是用连续的同质内存块存储数值以实现高效计算,默认不会存储臃肿的Python原生对象。当你给dtype参数传入Python原生的int类型(也就是你用到的np.int)时,NumPy会自动将其映射为当前平台默认的C风格整型,绝大多数64位系统下会映射为np.int64(也可写为np.int_),属于NumPy自定义的数值类型。
你可以运行print(arr_.dtype)验证,输出会是int64(32位系统下为int32),而非Python原生的int,足以证明dtype配置是生效的,只是你传入的Python类型被NumPy做了默认的类型映射。 - 最后
type(arr_[0]) is int返回False的原因:
从NumPy数组中取出的单个元素是NumPy的标量类型(比如numpy.int64),并非Python原生的int类型。type()判断会严格对比类型对象,自然会返回False。
如果你需要判断该标量是否兼容Python int类型,可以使用isinstance(arr_[0], int),该判断会返回True,因为NumPy的整型标量都继承自Python的int抽象类。
如果一定要让数组存储Python原生int对象,可以设置dtype=object,但这会失去NumPy数组的数值计算效率优势,和普通Python列表没有本质区别。
内容的提问来源于stack exchange,提问作者Peacepieceonepiece
相关产品推荐
相关产品推荐

