版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shenziheng1/article/details/83501299
1. 大型数组运算 numpy
需要在大数据集(比如数组或网格)上面执行计算。涉及到数组的重量级运算操作,可以使用 NumPy 库。 NumPy 的一个主要特征是给Python提供一个数组对象,相比标准的Python列表更适合做数学运算。 下面展示了标准列表对象和 NumPy 数组对象之间的差别:
import numpy as np
x = [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.linalg
m = 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=v
print( 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) ) # 1
print( 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 datetime
text = '2018-10-28'
y = datetime.strptime(text, '%Y-%m-%d')
z = datetime.now()
diff = z - y
print( diff )
# >>> 1 day, 11:00:32.970036
datetime.strptime() 方法支持很多的格式化代码, 比如 %Y 代表4位数年份, %m 代表两位数月份。 还有一点值得注意的是这些格式化占位符也可以反过来使用,将日期输出为指定的格式字符串形式。
本文参考《python3-codebook》