1.NumPy Ndarray 对象简介
NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。
2.Ndarray 内部组成
(1)一个指向数据(内存或内存映射文件中的一块数据)的指针。
(2)数据类型或 dtype,描述在数组中的固定大小值的格子。
(3)一个表示数组形状(shape)的元组,表示各维度大小的元组。
(4)一个跨度元组(stride),整数是为了前进到当前维度中下一个元素需要"跨过"的字节数。
3.Ndarray关键组成部分
(1)数据缓冲区(Data Buffer):存储数组元素的连续内存块,所有数据都以二进制格式保存在内存中。ndarray 支持各种数据类型,例如 int32、float64,这些数据类型通过 dtype 属性定义。
(2)数据类型描述符 (dtype):指定数组中每个元素的数据类型和大小。例如,int32 表示每个整数占 4 字节,float64 表示每个浮点数占 8 字节。dtype 还可以表示结构化数据类型,即包含多个字段的复合数据类型。
(3)维度 (shape):shape 是表示数组维数的元组。例如二维数组的 shape 属性可能是 (3, 4),表示数组有 3 行 4 列。shape 定义数据的逻辑结构,尽管所有元素是连续存储的。
(4)步长 (strides):表示在数组的每个维度中移动一个元素所需的字节数。strides 是与 shape 相同大小的元组,用于计算内存地址。例如,步长 (16, 4) 表示移动到下一行需要 16 字节,而在同一行中移动一个元素需要 4 字节。
(5)维数 (ndim):数组的维数。例如,标量的维数是 0,向量的维数是 1,矩阵的维数是 2。
(6)大小 (size):数组中元素的总数,即所有维度大小的乘积。例如,shape 为 (3, 4) 的数组,其 size 为 12。
(7)内存布局:ndarray 支持多种内存布局,例如C 语言风格(行优先,C_CONTIGUOUS)或 Fortran 风格(列优先,F_CONTIGUOUS)。内存布局影响数据的存储方式以及遍历数据效率。
4.Ndarray 的内部结构
跨度可以是负数,这会使数组在内存中后向移动。假设存在数组 obj = np.array([1, 2, 3, 4]),若使用切片 obj[::-1],步长为负数,数组会从最后一个元素反向读取,得到 [4, 3, 2, 1] 的结果。
(1)header:ndarray 的头部,包含了数组的元信息,如维数(ndim)、形状(shape)和步长(strides)等。这些信息定义数组的维度、数据布局以及如何通过步长在内存中访问数组元素。
(2)data-type:数组元素的数据类型定义,描述了数组每个元素的存储类型,例如 int32、float64 等。data-type 信息与数据缓冲区关联,用来解释每个元素的存储格式。
(3)ndarray 数据块:这是数组的实际数据存储区域,包含了数组的元素。元素在内存中按照 shape 和 strides 的定义顺序排列。这里的黑色方框表示一个特定的元素(标注为 array scalar)。
(4)array scalar:这个元素被从数组数据块中提取出来,可能是为了进行单独操作或计算。通过头部中的信息和步长可以找到并访问到这个元素。
(5)步长为负:图中还说明了 ndarray 的步长可以是负数,这意味着数组可以在内存中反向移动。通过使用负步长可以实现反向切片,如 obj[::-1] 或 obj[:, ::-1],从而使数组从最后一个元素开始向前访问数据。这种操作方式在不实际复制数据的情况下实现了反向排列。
5.调用 NumPy 的 array 函数创建ndarray
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
(1)object:数组或嵌套的数列
(2)dtype:数组元素的数据类型,可选
(3)copy:对象是否需要复制,可选
(4)order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
(5)subok:默认返回一个与基类类型一致的数组
(6)ndmin:指定生成数组的最小维度
6.使用 numpy 创建并打印简单的一维数组
import numpy as np
a = np.array([1,2,3])
print (a)
7.使用 numpy 创建并打印二维数组(矩阵)
# 多于一个维度
import numpy as np
a = np.array([[1, 2], [3, 4]])
print (a)
8.使用 ndmin 参数将一维数据强制升维为二维
# 最小维度
import numpy as np
a = np.array([1, 2, 3, 4, 5], ndmin = 2)
print (a)
9.通过 dtype 参数来指定数组的数据类型
# dtype 参数
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print (a)