Python Numpy 库:Ndarray 对象

本文仅介绍 ndarray 对象的基本操作,更多数学运算功能可以查阅说明文档或其他教程使用。

Numpy

NumPy(Numerical Python) 是 Python 的一个开源数值计算扩展库,可以用于大量的维度数组与矩阵的存储于运算,同时对数组运算提供大量的数学函数。相比 Python 本身提供的列表实现的多位数据结构,Numpy 提供的结构的预算将比嵌套列表效率更高,而且更节省资源。同时 Numpy 库也经常搭配很多数据处理或科学计算库使用,可以进入 Numpy 的官网NumPy 官方中文文档做进一步了解。

NumPy 主要包含的组件和功能有:

  1. N 维数组对象 Ndarray
  2. 广播功能函数
  3. 整合 C/C++/Fortran 代码的工具
  4. 线性代数、傅里叶变换、随机数生成等功能

NumPy 安装并使用

安装

在 cmd 命令下输入命令,等待安装完成即可。

pip install numpy

Anaconda 环境下配置就很简单了,找到 Numpy 库勾上就行,默认是启用的。

使用

想要使用 Numpy 库,就需要把 Numpy 库包含进来,代码如下。一般为了简化 Numpy 库的调用,约定俗成把 Numpy 简化为 np。

import numpy as np

Ndarray 对象创建

NumPy 提供了一个 N 维数组对象 ndarray,用于存放同类型元素的多维数组,同样是以 0 为开始用下标索引。

根据参数创建

利用向方法传递参数创建 ndarray 对象方法有:

方法 说明
np.empty(shape, dtype) 生成 shape 形状且元素类型为 dtype 的未初始化数组
np.ones(shape, dtype) 生成 shape 形状的元素全为 dtype 类型的 1 数组
np.zeros(shape, dtype) 生成 shape 形状的元素全为 dtype 类型的 0 数组
np.full(shape, val, dtype) 生成 shape 形状的元素全为 dtype 类型且数值为 val 数组
np.eye(n) 生成 n*n 的单位矩阵

例如如下代码将分别生成形状为 2 行 3 列(元祖表示)的未初始化、全为 1,全为 0 和全为 val(8) 的矩阵:

a = np.empty((2,3), dtype = int)
a = np.ones((2,3), dtype = int)
a = np.zeros((2,3), dtype = int)
a = np.full((2,3), 8, dtype = int)

它们生成的 ndarray 对象如下,由于 empty() 方法生成的是未初始化的矩阵,因此数组中的元素随机。

如下代码将生成 0 到 n‐1 (n=5)的数组。

a = np.arange(n, dtype = int)


如下代码将生成 5 行 5 列的单位矩阵。

a = np.eye(5)

生成数列

ndarray 对象可以以一维数组的方式生成一些数列,常用生成数列的方法有 2 个。

np.arange(start, stop, step, dtype)
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype)

arange 方法的参数说明如下:

参数 说明
start 起始值(默认为 0)
stop 终止值
step 步长(默认为 1)
dtype 数组元素的数据类型

例如下面的 2 行代码分别是用终值生成数列、加上初始值和步长生成数列。

a = np.arange(7)  
a = np.arange(5, 25, 5)  


linspace 方法的参数说明如下:

参数 说明
start 起始值(默认为 0)
stop 终止值
num 生成的等步长的样本数量,默认为 50
endpoint 该值为 true 时数列中包含 stop 值,反之不包含
dtype 数组元素的数据类型

例如生成初值为 2,终值为 10 且包含 5 个样本的数列代码为:

a = np.linspace(2, 10, 5)  

这句代码的效果如下:

基于现有结构

ndarray 对象可以从现有的结构转换,例如用列表和元素进行转换,使用的方法如下。

np.array(list/tuple, dtype)

例如先定义一个列表,然后用这个列表生成 ndarray 对象。

alist = [1, 2, 3, 4, 5]
a = np.array(alist)

array 方法的效果如下。

顺带一提 tolist() 方法可以把 ndarray 对象转换为列表,例如如下代码:

alist = a.tolist()


如下 3 个方法可以用现有 ndarray 对象的形状生成新数组,分别是:

方法 说明
np.ones_like(array) 根据 array 的形状生成新的全 1 数组
np.zeros_like(array) 根据 array 的形状生成新的全 0 数组
np.full_like(array,val) 根据 array 的形状生成新的全 val 数组

例如先生成一个 2 行 3 列的矩阵,然后分别生成全 1、全 0 和全 6 的数组。

a = np.empty((2,3), dtype = int)
b = np.ones_like(a)
b = np.zeros_like(a)
b = np.full_like(a,6) 

这些方法的效果如下:

Ndarray 对象属性

ndarry 对象由 2 部分组成,分别是实际的数据和描述数据的属性,包含以下这些属性。

属性 说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,n 行 m 列的矩阵
ndarray.size 数组元素的总个数
ndarray.dtype 数据元素的数据类型
ndarray.itemsize 每个元素的大小,以字节为单位

例如先生成一个 2 行 3 列的 ndarray 对象,分别查看该 ndarray 对象的各个属性。

a = np.ones((2,3))
a.ndim
a.shape
a.size
a.dtype
a.itemsize

对于该矩阵,查看各个属性如下。

Ndarray 对象数据类型

由于 ndarray 在底层使用 C 语言实现,因此对象中的每个元素在内存中都有相同存储大小的区域,ndarry 支持的数据类型如下。

数据类型 说明
bool 布尔型
int 默认的整数类型
intc C 语言的 int 类型
intp 用于索引的整数类型
intXX 整数(XX 表示用 XX 位表示,例如 int16)
uintXX 无符号整数(XX 表示用 XX 位表示,例如 uint16)
floatXX 半精度浮点数(XX 表示用 XX 位表示,例如 float16)
complexXX 复数,表示双 XX 位浮点数

Ndarray 对象变换

维度变换

可以使用下面的方法变换 ndarray 对象的维度,注意以下方法中有的方法会修改原数组,有的方法则不修改。

方法 说明
np.reshape(shape) 将数组转换为 shape 形状,原数组不变
np.resize(shape) 将数组转换为 shape 形状,覆盖原数组
np.flatten() 将数组降维为一维数组,原数组不变

例如先定义一个 2 行 3 列的数组,然后转换为 3 行 2 列,最后进行降维。

a = np.ones((2,3))
b = a.reshape((3,2))
a.resize((3,2))
b = a.flatten()

这些方法的效果如下:

类型变换

可以用 astype() 方法切换 ndarray 对象的数据元素的类型,该方法将生成一个新的 ndarray 对象。例如先生成一个数据元素为 int 类型的 ndarray 对象,然后将数据元素的类型转换为 float。

a = np.ones((2,3),float)
b = a.astype(int)

该方法的效果如下:

索引和分片

一维数组

若 ndarray 对象为一维数组,则它的分片方式和 list 类型很类似,语法如下。

ndarray[start(:end(:step))]
参数 说明
start 起始值
stop 终止值
step 步长

下面的一维数组分片和索引的简单样例:

a = np.arange(10)
a[2]
a[4:9]
a[2::2]

多维数组

多维数组的操作其实和一维数组一样,只不过是每一个维度都可以按照一维数组的语法来分片,每个维度之间的索引或分片用逗号(,)隔开。

a = np.arange(18).reshape((3,2,3))
a[1]
a[:,1]
a[:,:,1]
a[:,1,1]
a[1,1]
a[1,1,1]
a[0::2,:,:]
a[0::2,:,1]
a[0::2,1,:]
a[0::2,1,1]

参考资料

Numpy 官网
NumPy 官方的中文文档
理解numpy中ndarray的内存布局和设计哲学
菜鸟教程——Numpy
中国大学 MOOC——Python数据分析与展示

posted @ 2021-03-07 21:42  乌漆WhiteMoon  阅读(331)  评论(0编辑  收藏  举报