python数字处理技巧(2): Numpy、矩阵运算、随机、字符串日期

版权声明:本文为博主原创文章,未经博主允许不得转载。 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》

猜你喜欢

转载自blog.csdn.net/shenziheng1/article/details/83501299