这里介绍NumPy数组的类型,并说明视图与副本的区别
类型
数字类型
dtype参数指定创建元素的类型。而astype()方法则转换数组元素为指定类型
1 | import numpy as np |
iinfo()获取整型的最小值、最大值
1 | import numpy as np |
finfo()获取浮点型的最小值、最大值
1 | import numpy as np |
字符串类型
- np.str_类型:固定(Unicode)字符数的Unicode字符串类型。类型的字符代码U。即:U5表示字符串最多包含5个Unicode字符
- np.bytes_类型:固定字节数的字节字符串类型。类型的字符代码S。即:S3表示字符串最多包含3个字节
1 | import numpy as np |
numpy 2.0支持变长字符串类型:numpy.dtypes.StringDType
1 | import numpy as np |
结构化数据类型
结构化数据类型使用元组列表来定义各字段的类型,每个字段使用一个元组描述类型信息。具体地:元组形式为:(字段名称,数据类型,形状)。其中形状是可选的
1 | import numpy as np |
我们可使用Python元组列表来进行初始化,然后使用位置索引 访问/修改 对应的元素;此外,还支持使用字段名称索引 访问/修改 数组中元素的相应字段
1 | import numpy as np |
视图/副本
NumPy数组事实上由两部分组成:包含实际数据元素的原始数据数组、元数据信息。其中,后者提供了如何解释原始数据的相关信息。例如:数据类型、维数等。值得注意的是,对于reshape()方法而言,该方法会在条件允许的情况下创建视图,否则将创建副本
- 视图:可通过view()方法创建视图。对于视图而言,其使用的原始数据数组和原数组是同一份。其仅通过改变元数据信息,来实现对原数组不同形式的访问。所以,下例对原数组a、视图数组a_view进行修改时,均会影响彼此
- 副本:可通过copy()方法创建副本。对于副本而言,其会复制原数组的原始数据数组、元数据来创建一个新数组。换言之,副本与原数组,不仅元信息不是同一份,连原始数组也不是同一份。所以,下例对原数组a、副本数组a_copy进行修改时,均不会影响彼此
1 | import numpy as np |
可通过下述属性判断一个NumPy数组是视图还是副本:
- base 属性: 用于判断该数组的原始数据是否来自其他数组。如果该数组是另一个数组的视图,则该属性指向源数组;如果该数组是副本,则该属性为None
- flags.owndata 属性:用于指示该数组是否拥有自己的原始数据。如果该数组是视图,则该属性为false;如果该数组是副本,则该属性为true
1 | import numpy as np |