1. 大型数组运算 numpy
需要在大数据集(比如数组或网格)上面执行计算。涉及到数组的重量级运算操作,可以使用 NumPy 库。 NumPy 的一个主要特征是给Python提供一个数组对象,相比标准的Python列表更适合做数学运算。 下面展示了标准列表对象和 NumPy 数组对象之间的差别:
import numpy as npx = [1,2,3,4]y = [5,6,7,8]print( x*2 ) # [1, 2, 3, 4, 1, 2, 3, 4]print( x+y ) # [1, 2, 3, 4, 5, 6, 7, 8]"""#TypeError: can only concatenate list (not "int") to list"""# print( x+10) nx = np.array(x)ny = np.array(y)print( nx*2 ) # [2 4 6 8]print( nx+ny ) # [ 6 8 10 12]print( nx+10 ) # [11 12 13 14]
两种方案中数组的基本数学运算结果并不相同。 特别的,NumPy 中的标量运算(比如 ax * 2 或 ax + 10 )会作用在每一个元素上。 当两个操作数都是数组的时候执行元素对等位置计算,并最终生成一个新的数组。NumPy 还为数组操作提供了大量的通用函数,这些函数可以作为 math 模块中类似函数的替代。例如, np.sqrt(), np.cos()。使用这些通用函数要比循环数组并使用 math 模块中的函数执行计算要快的多。 因此,尽量选择 NumPy 的数组方案。底层实现中,NumPy 数组使用了C或者Fortran语言的机制分配内存。 它是一个非常大的连续的并由同类型数据组成的内存区域。 所以,可以构造一个比普通Python列表大的多的数组。 比如,构造一个10,000*10,000的浮点数二维网格。特别主意:numpy扩展了Python列表的索引功能 - 特别是对于多维数组。
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])print( a )# >>> [[ 1 2 3 4]#[ 5 6 7 8]#[ 9 10 11 12]]print( a[0] )# >>> [1 2 3 4]print( a[:,1] )# >>> [ 2 6 10]print( a[0:2, 0:2])# >>> [[1 2]#[5 6]]print( np.where(a < 5, a, 0))# >>> [[1 2 3 4]#[0 0 0 0]#[0 0 0 0]]
2. 矩阵与线性代数运算 numpy
当执行矩阵和线性代数运算,比如矩阵乘法、寻找行列式、求解线性方程组的时候也可以利用numpy处理。
NumPy 库有一个矩阵对象可以用来解决这个问题。 矩阵类似上面的数组对象,但是遵循线性代数的计算规则。
numpy.matrix()
m = np.matrix([[1,-2,3], [0,4,5], [7,8,-9]])print( m )# >>> [[ 1 -2 3]#[ 0 4 5]#[ 7 8 -9]]print( m.T )# >>> [[ 1 0 7]#[-2 4 8]#[ 3 5 -9]]print( m.I ) # 逆矩阵# >>> [[ 0.33043478 -0.02608696 0.09565217]#[-0.15217391 0.13043478 0.02173913]#[ 0.12173913 0.09565217 -0.0173913 ]]v = np.matrix([[2],[3],[4]])print( v ) # 列向量作为矩阵的乘子# >>> [[2]#[3]#[4]]print( m * v )# >>> [[ 8]#[32]#[ 2]]
numpy.linalg : 行列式、特征值、特征性向量、线性代数求解等
import numpy.linalgm = np.matrix([[1,-2,3], [0,4,5], [7,8,-9]])v = np.matrix([[2],[3],[4]])# 计算行列式print( numpy.linalg.det(m) )# >>> -229.99999999999983# 计算奇异值print( numpy.linalg.eigvals(m) )# >>> [-13.11474312 2.75956154 6.35518158]# 计算线性方程的解 mx=vprint( numpy.linalg.solve(m, v) )# >>> [[0.96521739]#[0.17391304]#[0.46086957]]
3. 随机选择 random
可以利用random模块从一个序列中随机抽取若干元素,或者想生成几个随机数。random 模块有大量的函数用来产生随机数和随机选择元素。
import random# 随机取单个样例values = [1, 2, 3, 4, 5, 6]print( random.choice(values) ) # 1print( random.choice(values) ) # 5# 随机抽取多个样例print( random.sample(values, 3) )# >>> [1, 5, 3]print( random.sample(values, 3) )# >>> [4, 1, 6]# 打乱数组/列表的顺序random.shuffle(values)print( values )# >>> [1, 6, 2, 4, 3, 5]# 生成指定范围内的整数随机数print( random.randint(0,10) )# >>> 8# 生成0到1范围内均匀分布的浮点数print( random.random() )# >>> 0.38424002551957526
Comment:
random 模块使用Mersenne Twister算法来计算生成随机数。这是一个确定性算法, 但是可以通过random.seed()函数修改初始化种子。random模块还包含基于均匀分布、高斯分布和其他分布的随机数生成函数。 random.uniform() 计算均匀分布随机数, random.gauss() 计算正态分布随机数。
4. 日期与时间转换 datatime
当我们的应用程序接受字符串格式输入,可以将它转换为 datetime 对象并执行非字符串操作。
from datetime import datetimetext = '-10-28'y = datetime.strptime(text, '%Y-%m-%d')z = datetime.now()diff = z - yprint( diff )# >>> 1 day, 11:00:32.970036
datetime.strptime() 方法支持很多的格式化代码, 比如 %Y 代表4位数年份, %m 代表两位数月份。 还有一点值得注意的是这些格式化占位符也可以反过来使用,将日期输出为指定的格式字符串形式。
本文参考《python3-codebook》