Python 科学计算库 NumPy,其中大部分模块采用 C 语言编写,并针对科学计算(线性代数计算)设计了 ndarray(多维数组)对象,该对象类似于 Python 中的 list 对象,但却更少在应用中使用性能较差的循环。以上这些使得 NumPy 的性能比纯 Python 要高。
本文采用的系统环境是 CentOS 7.0 x64,Python 2.7.5 和 NumPy 1.9.1。假设已经执行了“import numpy as np”语句,因而在代码中使用 np 指代 numpy 库。
ndarray 对象用于存储多维数组,内置支持 element-by-element 计算,无需像 Python 中 List 对象数学计算那样使用大量的循环,因而更加的高效。一个 ndarray 对象中的所有元素必须是相同的数据类型。一般使用 np.array、np.arange、np.zeros、np.ones 和 np.identity 等函数创建 ndarray 对象。
a = np.array([0,1,2,3,4]) b = np.arange(10) c = np.zeros() d = np.ones() e = identity()
NumPy 中的 ndarray 对象和 Python 中的 list 对象之间可以进行转换。
# 创建 list 对象 a = range(2) b = range(2) # 将 list 对象转换为 ndarray 对象 m = np.array([a, b]) # array([[0, 1], # [0, 1]]) # 将 ndarray 对象转换为 list 对象 m.tolist() # [[0, 1], [0, 1]]
ndarray 对象中的各元素必须是统一的数据类型。常用的数据类型有 bool、int64、float64 和 complex。NumPy 提供了数据类型转换函数,函数名称与数据类型的名称一致。ndarray 对象也提供了 astype 方法,可以转换元素的数据类型。注意:不支持将 complex 数据类型转换为 int 或 float 数据类型。
# 数据类型转换 np.float64(42) # 42.0 # 多维数组数据类型转换 a = np.arange(10) print a.dtype # dtype('int64') b = np.float64(a) print b.dtype # dtype('float64') c.astype(np.float64) print c.dtype # dtype('float64')
一维数组也称为 Vector(向量),对于其中元素的引用,类似于 Python 中的 list 对象的元素引用(索引从 0 开始),同样也支持“切片”和“步进”。注意:ndarray 对象的切片是内存引用,对切片进行的修改会影响 ndarray 对象。
# 创建 ndarray 对象 a = np.arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) print type(a) # numpy.ndarray # 输出 ndarray 对象中元素的数据类型 print a.dtype # dtype('int64') # 输出 ndarray 对象的大小 print a.shape # (10,) # 引用 ndarray 对象中的元素 a[5] # 5 a[3:7] # array([3, 4, 5, 6]) a[:7:2] # array([0, 2, 4, 6]) a[::-1] # array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
使用一维数组的 reshape 方法,可以将一维数组转换为多维数组。通过 shape 函数来获取 ndarray 对象的行数和列数。多维数组的元素访问,与一维数组的元素访问方法类似。
# 创建多维 Array 变量 m = array([np.arange(2), np.arange(2)]) # array([[0, 1], # [0, 1]]) # 创建一维数组 a = np.arange(24) # 转换为多维数组 b = a.reshape(2,3,4) # 输出多维数组的大小 print b.shape # (2, 3, 4) # 访问多维数组中的元素 b[:,0,0] # array([ 0, 12]) b[0] b[0,:,:] b[0, ...] # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]]) b[0,1,::2] # array([4, 6]) b[::-1] # array([[[12, 13, 14, 15], # [16, 17, 18, 19], # [20, 21, 22, 23]], # [[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]]]) # Ravel b.ravel() # Flatten b.flatten() # Shape:修改多维数组的维度 b.shape = (6, 4) # Transpose b.transpose() # Resize:修改多维数组的维度 b.resize((6, 4))
ndarray 对象还有很多有用的属性。
ndarray.ndim # 维度 ndarray.size # 元素个数 ndarray.itemsize # 每个元素占用的字节数 ndarray.nbytes # 占用的总字节数 ndarray.T # 逆向量,等同于 ndarray.transpose() 函数 ndarray.real # complex 的实数部分 ndarray.imag # complex 的虚数部分 ndArray.flat # 转为一维数组,等同于 ndarray.flatten() 函数
matrix(矩阵)
matrix(矩阵)本质上是一种特殊的 ndarray 对象,matrix 对象只可以是二维的。
ufunc(通用函数)是作用在 ndarray 对象的具备 element-by-element 特性的函数。在 NumPy 中,ufunc 是 numpy.ufunc 类的实例。
np.empty:创建指定维度的数值为随机数的 ndarray 对象
np.eye:创建指定维度的,对角线数值为1其余为0的 ndarray 对象
np.ones:创建指定维度的数值为1的 ndarray 对象
np.zeros:创建指定维度的数值为零的 ndarray 对象
np.full:创建指定维度和数值的 ndarray 对象
np.array:创建 ndarray 对象
np.copy:根据现有的 ndarray 对象复制出新的 ndarray 对象
np.arange:创建连续的从零开始至指定数值的 ndarray 对象
np.linspace:根据起始数值、结束数值和间隔个数,创建 ndarray 对象
np.mat:创建 matrix(矩阵)对象
np.reshape:修改 ndarray 对象的维度,不改变元素的数值
np.ravel:将 ndarray 对象转换为一维数组
np.flat:将 ndarray 对象转换为一维数组
np.flatten:将 ndarray 对象转换为一维数组
np.transpose:反转 ndarray 对象的维度
np.asmatrix:将 ndarray 对象转换为 matrix 对象
np.loadtxt:从文本文件中读取数据
np.savetxt:将数据保存至文本文件中
np.genfromtxt:从文本文件中读取数据
np.average:计算 Array 变量中元素的平均数(通过 weights 参数进行加权计算)
np.mean:计算 Array 变量中元素的算术平均数
np.median:计算 Array 变量中元素的中位数
np.max:计算 Array 变量中元素的最大值
np.min:计算 Array 变量中元素的最小值
np.ptp:计算 Array 变量中元素的最大值和最小值的差值
np.var:计算 Array 变量中元素的方差
np.std:计算 Array 变量中元素的标准差
np.all:判断指定维度是否全部值为 True
np.any:判断指定维度是否有值为 True
《NumPy User Guide》,NumPy Community
《NumPy Reference》,NumPy Community
《NumPy Beginner's Guide》,Ivan Idris,Packt Publishing