使用 NumPy 进行科学计算

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(多维数组)

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(通用函数)

ufunc(通用函数)是作用在 ndarray 对象的具备 element-by-element 特性的函数。在 NumPy 中,ufunc 是 numpy.ufunc 类的实例。

创建 ndarray 对象

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(矩阵)对象

操作 ndarray 对象

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


你可能感兴趣的:(python,numpy)