- ·上一篇内容:NumPy 数组数据类型的转换
- ·下一篇内容:NumPy数组的创建函数
NumPy数组的相关属性
NumPy中提供了一系列的属性方便用户获取数组的一些基本信息,如数组的维度、数据的元素类型、数组的形状等。
NumPy数组的shape属性
NumPy数组的shape属性用于获取数组的形状信息,即数组每维的大小。该属性返回一个元组,元组中的每个数据代表数组每一维的大小。用户也可以使用该属性来修改数组每维的大小。
下面通过两个例子来演示NumPy数组shape属性的具体使用方法。
利用shape属性获取数组的形状信息
import numpy as np arr = np.array([[11, 12, 13], [21, 22, 23]]) print(arr.shape)
输出结果信息如下:
(2, 3)
上面的输出结果表明:该数组每维的大小是2和3,即2行3列。
利用shape修改数组的形状
import numpy as np arr = np.array([[11, 12, 13], [21, 22, 23]]) print('原数组:\n', arr) arr.shape = (3, 2) print('修改形状后:\n', arr)
输出结果信息如下:
原数组:
[[11 12 13]
[21 22 23]]
修改形状后:
[[11 12]
[13 21]
[22 23]]
上面修改后的形状是,每维的大小是3和2,即3行2列。
NumPy数组的ndim属性
NumPy数组的ndim属性用于获取数组的维数(轴的数量)。
在NumPy中,数组的维数也称为数组的秩(rank)。
NumPy数组的每一个轴(axis)对应一个维度,因此,轴的数量也是数组的秩。
下面使用一个例子来演示ndim属性的具体使用方式。
import numpy as np arr1 = np.arange(24) print(arr1.ndim) arr2 = arr1.reshape(2, 3, 4) print(arr2.ndim)
输出结果如下:
1
3
NumPy数组的size属性
NumPy数组的size属性用于获取数组元素的总数量。一般情况下,该值是数组各维大小的乘积,亦即使用shape属性获取到的元组中各元素的乘积。
下面使用一个例子来说明size属性的具体使用方法。
import numpy as np ele = [[[111, 112, 113], [121, 122, 123]], [[211, 212, 213], [221, 222, 223]]] arr = np.array(ele) print('该数组为:\n', arr) print('数组shape:', arr.shape) print('数组元素个数:', arr.size)
输出结果如下所示:
该数组为:
[[[111 112 113]
[121 122 123]]
[[211 212 213]
[221 222 223]]]
数组shape: (2, 2, 3)
数组元素个数: 12
NumPy数组的dtype属性
NumPy数组的dtype属性用于获取数组元素的数据类型。NumPy支持多种数据类型,每个数据类型都由dtype对象来表示。该对象不仅包含了数组元素的数据类型,也指定了数据元素所占内存的大小以及在内存中的字节顺序。
下面使用一个例子来说明dtype属性的使用方法。
import numpy as np # 创建一个整型数组 int_arr = np.array([1, 2, 3], dtype=np.int32)
print("整型数组:", int_arr, "\t数据类型:", int_arr.dtype)
# 创建一个浮点类型数组
float_arr = np.array([1.1, 2.2, 3.3], dtype=np.float64)
print("浮点类型数组:", float_arr, "\t数据类型:", float_arr.dtype)
# 创建一个复数类型数组
complex_arr = np.array([1 + 2j, 3 + 4j])
print("浮点类型数组:", complex_arr, "\t数据类型:", complex_arr.dtype)
输出结果如下所示:
整型数组: [1 2 3] 数据类型: int32
浮点类型数组: [1.1 2.2 3.3] 数据类型: float64
浮点类型数组: [1.+2.j 3.+4.j] 数据类型: complex128
NumPy数组的itemsize属性
NumPy数组的itemsize属性用于获取数组中每个元素所占的字节数。数组元素所占的字节数由数组元素的数据类型决定,不同的数据类型所占的字节数各异。如int32类型的元素占用4个字节,int64类型的元素占用8个字节数。
下面使用一个例子来说明itemsize属性的具体使用方式。
import numpy as np arr1 = np.array([1, 2, 3], dtype=np.int8) print('arr1数组元素所占的字节数为:', arr1.itemsize) arr2 = np.array([1, 2, 3], dtype=np.int32) print('arr2数组元素所占的字节数为:', arr2.itemsize) arr3 = np.array([1, 2, 3], dtype=np.float64) print('arr3数组元素所占的字节数为:', arr3.itemsize)
其输出结果如下所示:
arr1数组元素所占的字节数为: 1
arr2数组元素所占的字节数为: 4
arr3数组元素所占的字节数为: 8
由以上输出结果可以看出,即使对于同样的数组元素,由于指定的数据类型不一样,其占用的字节数也是不一样的。
NumPy数组的nbytes属性
NumPy数组的nbytes属性用于返回数组所有元素占用的字节数。
下面程序给出了该属性使用的一个例子。
import numpy as np arr1 = np.array([1, 2, 3, 4]) print('arr1的数据类型:', arr1.dtype, ',arr1占用的总字节数为:', arr1.nbytes) arr2 = np.array([1, 2, 3, 4], dtype = np.float64) print('arr2的数据类型:', arr2.dtype, ',arr2占用的总字节数为:', arr2.nbytes)
其输出结果如下:
arr1的数据类型: int32 ,arr1占用的总字节数为: 16
arr2的数据类型: float64 ,arr2占用的总字节数为: 32
arr1默认的数据类型为32位的整型,即每个元素占用4个字节,则4个元素占用16个字节。arr2为64位的浮点数,即每个元素占用8个字节,则4个元素占用32个字节。
NumPy数组的strides属性
NumPy数组的strides属性用于获取数组某一维(轴)上相邻两个元素相差的字节数,或在遍历数组元素时,在数组的某维中,从一个元素到下一个元素需要经历的字节数。stride本身的含义为步幅,该属性是一个整数的元组,元组中的每个整数对应数组每个维度上相邻两个元素的地址差。
import numpy as np arr1 = np.array([[11, 12, 13], [21, 22, 23], [31, 32, 33]]) print('arr1数组的shape:', arr1.shape) print('arr1数组的strides:', arr1.strides) arr2 = np.array([[[111, 112, 113], [121, 122, 123], [131, 132, 133]], [[211, 212, 213], [221, 222, 223], [231, 232, 233]]]) print('arr2数组的shape:', arr2.shape) print('arr2数组的strides:', arr2.strides)
输出结果为:
arr1数组的shape: (3, 3)
arr1数组的strides: (12, 4)
arr2数组的shape: (2, 3, 3)
arr2数组的strides: (36, 12, 4)
以上创建的两个数组都为Int32类型的,每个元素占用4个字节。对于arr1来讲,其是一个包含3行3列的数组,每行3个整型数,每个整数占用4个字节,则每行占用12个字节,所以从1行跨到相邻的下一行需要跨过12个字节;因为每个元素占用4个字节,则在某一行中的某个元素到该行相邻的元素需要跨过4个字节,这便是输出的(12, 4)的含义。同理可以解释3维数组中(36, 12, 4)结果的含义。
NumPy数组flags属性
NumPy数组的flags属性用于描述数组在内存中的布局信息,比如数组在内存中是否在相邻段中存储。
NumPy提供了下表所示的几种标志用于描述数组内存布局的几个方面或属性。
序号 | flag | 含义 |
---|---|---|
1 | C_CONTIGUOUS (C) | 数组数据在单一的C风格的连续段中存储 |
2 | F_CONTIGUOUS (F) | 数组数据在单一的Fortran风格的连续段中存储 |
3 | OWNDATA (O) | 数组是否拥有数据的存储区域(如若数组是其它数组的视图时,该数组并不拥有数据的存储区域) |
4 | WRITEABLE (W) | 数据区域是否可被写入,若将其设置为False,数据变为只读 |
5 | ALIGNED (A) | 数据和所有元素都适当的对齐到硬件上 |
6 | WRITEBACKIFCOPY (U) | 该数组是其它数组的一个副本,当该数组被释放时,原数组内容将被更新 |
下面使用一个例子来说明该属性的具体使用方法。
import numpy as np arr1 = np.array([11, 12, 13, 14]) print('arr1数组的flags:\n', arr1.flags) arr2 = np.array([[11, 12, 13], [21, 22, 23]]) print('arr2数组的flags:\n', arr2.flags) arr3 = arr1.view() print('arr3数组的flags:\n', arr3.flags)
输出结果如下所示:
arr1数组的flags:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
arr2数组的flags:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
arr3数组的flags:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
NumPy数组的base属性
NumPy数组的base属性是在某一数组是其他数组的视图时,返回其基对象,即派生该数组的原始数组。如果该数组拥有自己的数据,则返回None.
下面给出base属性的使用方法。
import numpy as np arr = np.array([[11, 12, 13], [21, 22, 23]]) view_arr = arr[0:1, :] print('view_arr数组的基数组为:\n', view_arr.base)
输出结果为:
view_arr数组的基数组为:
[[11 12 13]
[21 22 23]]
NumPy数组的real属性和imag属性
NumPy数组中的real属性和imag属性分别返回复数数组的实部和虚部。
下面给出一个例子来演示这两个属性的具体使用方法。
import numpy as np arr = np.array([1 + 2j, 3 + 4j, 5 + 6j]) # 获取数组的实部 real_part = arr.real # 获取数组的虚部 imag_part = arr.imag print('数组的实部:', real_part) print('数组的虚部:', imag_part)
输出结果为:
数组的实部: [1. 3. 5.]
数组的虚部: [2. 4. 6.]
微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。
个人成长离不开各位的关注,你的关注就是我继续前行的动力。