Python / Numpy 数组属性和方法

Numpy 数组属性和方法

ndarray 对象预留了一些方法供我们调用,通过这些方法,我们可以查探到数组的一些基本信息,例如 dtype 可以查看数组的数据类型。本小节将介绍其他常用的方法,比如数组的大小、维数(秩)、元素的数据类型、每个元素的大小等等。

1. 数组的维数

1.1 ndim

数组的维数,即数组的秩,用来表征数组轴的数量或维度的数量。对于行向量:

arr_1 = np.array([1,2,3])
arr_1
Out:
    array([1, 2, 3])

这是一个典型的一维数组,其秩记为 1,也就是说行向量只有一个轴(axis)。

对于二维数组:

arr_2 = np.array([[1,2,3],[4,5,6]])
arr_2
Out:
    array([[1, 2, 3],
           [4, 5, 6]])

可以把该二维数组视作是两个一维数组组成,其秩记为 2,也就是说二维数组有两个数据轴。

我们可以用下图来表征数组的数据轴:

图片描述
在 Numpy 中数据轴记为 axis,其中 axis=0 记为最外层的轴。在二维数组中对应于列方向(即为上图的垂直方向)。

案例

通过 ndim 来查看一维数组的秩。

arr_1.ndim
Out:
    1

通过ndim来查看二维数组的秩。

arr_2.ndim
Out:
    2

2. 数组的维度

2.1 shape

数组的维度(n,m),即数组大小,对应于矩阵的 n 行 m 列。

通常通过 shape 来查询数组的维度,该方法返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。元祖的元素分别表征各个数据轴上的元素的个数。

案例

我们用 shape 来查看一维数组的维度。

arr_1.shape
Out:
    (3,)

可以看到一维数组只有一个数据轴,该数据轴上包含 3 个元素。

我们用shape来查看二维数组的维度。

arr_2.shape
Out:
    (2, 3)

可以看到,arr_2 是一个 2 行 3 列(2×3)的数组。

2.2 reshape

ndarray 提供了一个不改变数组元素内容、直接改变数组维度的方法:reshape。通过该方法,可以方便地对数组元素进行重排。

reshape 的函数调用方法如下:

ndarray.reshape(newshape, order="C")

构造函数接受的参数详解如下:

参数 描述
newshape 变更后的数组维度
order 数据元素重排方式,有C、F、A可选。“C”指的是用类C写的读/索引顺序的元素,对二维数组,是优先读写行;“F”是指用FORTRAN类索引顺序读/写元素,对二维数组,是优先读写列。“A”表示排序方式跟随原数组。

案例

利用 reshape 方法生成一个维度为 4*5、优先读写行的二维数组。

np.array(range(20)).reshape((4,5), order="C")

这里用 range(20) 生成一个长度为20的有序序列,用 reshape 进行重排序,order 表示优先读写行。

Out:
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19]])

3. 数组元素的总个数

3.1 size

ndarray 提供了 size 方法,可以快速查看数组中元素的格式,该方法对应于 shape 方法中 n*m 的值。

案例

快速查看二维数组的元素格式:

arr_2.size
Out:
    6

可以看到,arr_2 数组共含有 6 个元素。

4. 查看数组元素的大小

4.1 itemsize

该方法以字节的形式返回数组中每一个元素的大小。

例如:一个元素类型为 float64 的数组 itemsize 属性值为 8。因为 float64 占用 64 个 bits,每个字节长度为 8,所以 64/8,占用 8 个字节。

又如:一个元素类型为 complex32 的数组 item 属性为 4。因为 complex32 占用 32 个 bits,占用 4 个字节。

案例

先创建一个 dtype 为 int32 的数组,再查看其元素的大小。

x = np.array([1,2,3,4], dtype=np.int32)
x.itemsize
Out: 4

5. 小结

本节重点介绍了数组常用的属性(维数、维度、元素个数、元素大小),其中 shape 与 reshape 是最常用的两种方法。需要注意的是,reshape 方法和 range() 联用,可以快速创建维数较高的数组,较为常用。