分享

3

 LQuan 2018-02-12

Numpy库

 Numpy库是Python的一种开源的数值计算扩展。
 Numpy可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效很多。
 据说Numpy将Pyhon变成了一种免费的更强大的Matlab系统。Numpy库包含了:

1. 强大的N维数组对象 2. 精密的函数 3. 连接C/C++和Fortran代码的工具 4. 常用的线性代数,傅里叶变换和随机数生成
x
import numpy as np

一、数组array

数组array和列表list类似,但是数据array可以定义维度,且适合做数学代数运算

1.1 数组array生成

1
a1 = np.array([1,2,3,4,4,5,6])
这是一个一维数组: [1 2 3 4 4 5 6]这是一个二维数组: [[1 2 3] [4 5 6]]查看a1的长度: 7查看a2的长度: 2
1
a2
1
a2[0,1]

1.2 数组array性质

1
'''数组元素整数转化为浮点数'''
数组类型: int64改变数组类型后: float64
1
'''字符串数字转化为浮点数'''
['1.11' '2.22' '3.33']
1
a = np.array([[1,2,3],[4,5,6]])
[[1 2 3] [4 5 6]]第二行第三列元素(第二行索引为1,第三列索引为2): 6倒数第一行(注意索引为-1): [4 5 6]第三列(索引为2): [3 6]a形状: (2, 3)a形状重构: [[1 2] [3 4] [5 6]]
1
print(a)
[[1 2 3] [4 5 6]]维度解锁: [1 2 3 4 5 6]按列求和: [5 7 9]按列求积: [ 4 10 18]全局最大值: 6 全局最小值: 1按行求最大值: [4 5 6] 按列求最小值: [1 4]按列求均值: [ 2.5 3.5 4.5]按行求标准差: [ 1.5 1.5 1.5]
1
x = np.random.randint(1,20,(4,3))
原矩阵: [[ 5 1 5] [16 13 6] [ 5 4 1] [18 14 12]]按列求和: [44 32 24]按行求均值: [ 3.66666667 11.66666667 3.33333333 14.66666667]按行累加: [[ 5 6 11] [16 29 35] [ 5 9 10] [18 32 44]]
1
x = np.random.randint(1,5,(3,3))
矩阵所有元素求指数: [[ 54.59815003 54.59815003 20.08553692] [ 20.08553692 2.71828183 2.71828183] [ 7.3890561 7.3890561 2.71828183]]矩阵所有元素求根号: [[ 2. 2. 1.73205081] [ 1.73205081 1. 1. ] [ 1.41421356 1.41421356 1. ]]

小数位数控制和取整

1
b = np.array([1.12312,2.12313,1.1100])
[ 1.12312 2.12313 1.11 ]小数位数: [ 1.12 2.12 1.11]
1
x = np.random.randn(5)
原数组: [-0.44301833 -0.12900231 -0.42061772 0.28445053 0.46076555]向上取整: [-1. -1. -1. 0. 0.]向下取整: [-0. -0. -0. 1. 1.]四舍五入(控制小数为2位): [-0.44 -0.13 -0.42 0.28 0.46]

数组——一元函数

函数说明
abs、fabs计算整数、浮点数或复数的绝对值。对于非复数,使用fabs更快
sqrt、square、exp计算各元素的平方根、平方、指数$e^x$
log、log10、log2、log1p自然对数、底数10的对数、底数2的对数、$ln(1+x)$
sign计算各元素的正负号:正1,零0,负-1
ceil计算各元素的取整:大于等于该数的最小整数
floor计算各元素的取整:小于等于该数的最大整数
rint各元素四舍五入最接近的整数,dtype不变
modf将数组各元素的小数和整数部分以两个独立数组的形式返回
isnan、isfinite、isinf判断各元素是否为NaN、是否有穷、是否为无穷
cos、cosh、sin、sinh、tan、tanh一般和双曲型的三角函数
arccos、arccosh、arcsin、arcsinh、arctan、arctanh反三角函数
sum、mean数组全部或者按某个轴的方向进行求和、求均值
std、var标准差、方差,自由度可以调整
min、max、argmin、argmax最小和最大值、最小和最大元素的索引
cumsum、cumprod数组全部或者按某个轴的方向进行累计和、累计积

1.3 数组array间运算

1
a, b = np.array([1,2,3,4]), np.array([2,3,4,5])
[1 2 3 4][2 3 4 5]数组相加: [3 5 7 9]数组相乘: [ 2 6 12 20]数组乘方: [ 1 8 81 1024]数组判断: [False True True True]向量内积: 40
1
print('取两个数组中的较大值组成新的数组:',np.maximum(a,b))
取两个数组中的较大值组成新的数组: [2 3 4 5]取两个数组中的较小者组成新的数组: [1 2 3 4]
1
x1 = np.array([True,False,True])
[ True False True][False False True][False False True][ True False True][ True False False]

数组——二元函数

函数说明
add、multiply数组中对应的元素相加、相乘
substract第一个数组减去第二个数组中的元素
divide、floor_divide除法、向下圆整除法(余数直接舍弃)
power对于第一个数组中的元素,根据第二个数组中的对应元素,进行幂运算
maximum、fmax元素级的最大值、fmax功能相同只是忽略NaN
minimum、fmin元素级的最小值、fmin功能相同只是忽略NaN
mod元素级的求余
copysign将第二个数组中的值的符号复制给第一个数组中的值
greater、greater_equal、less、less_equal、equal、not_equal元素级的比较运算,产生True或者False为元素的数组
logical_and、logical_or、logical_xor元素级的逻辑判断(且、或者、不等于)

1.4 数组array集合运算

1
x = np.array([1,2,3,3,3,3,4,5,10,10,20,30])
数组x中的唯一元素: [ 1 2 3 4 5 10 20 30]数组x和y的公共元素: [ 1 2 3 10 20]数组x和y的并集: [ 1 2 3 4 5 10 20 30 40 100]数组x中的元素是否包含于y: [ True True True True True True False False True True True False]集合差_在x中而不在y中的元素: [ 4 5 30]只存在某个数组中,而不同时存在于两个数组中: [ 4 5 30 40 100]

1.5 数组array切片进阶

1
a = np.array(range(10))
[0 1 2 3 4 5 6 7 8 9][0 2 4 6 8][1 3 5 7 9]
1
a = np.array([[ 0, 1, 2, 3, 4, 5],
截取第1行第4,5个元素: [3 4]截取第5行至最后,第5列至最后的元素: [[44 45] [54 55]]截取第3,5行,第1,3,5列 [[20 22 24] [40 42 44]]

1.6 数组排序

1
# 对一个数组array,想找到其中大于0的数所在的索引位置 可以用where函数
大于0元素所在的索引: (array([2, 3, 5, 6]),)
1
# 对于exp这个数组,希望对其按元素大小进行排序
从小到大排序: [ -100 -2 -1 2 2 33 10000]
1
exp2 = np.array([[-23,29,1],
按行排序: [[-23 -10 1] [ -4 4 7] [ 2 29 12]]按列排序: [[-23 1 29] [ 2 4 12] [-10 -4 7]]
1
exp3 = np.array([6,5,4,3,2,1])
排序后元素所在的原索引位置 [5 4 3 2 1 0]

1.7 数组拼接

1
a1 = np.array([6,5,4,3,2,1])
纵向拼接: [[6 5 4 3 2 1] [1 2 3 4 5 6]]横向拼接: [6 5 4 3 2 1 1 2 3 4 5 6]
1
exp1 = np.array([[-23,29,1],
纵向拼接: [[-23 29 1] [ 2 4 12] [ -4 -10 7] [ 0 0 0] [ 0 0 0] [ 0 0 0]]横向拼接: [[-23 29 1 0 0 0] [ 2 4 12 0 0 0] [ -4 -10 7 0 0 0]]

使用np.r_和np.c_也可以实现拼接的功能
注意纵向拼接的时候,np.c_产生的结果是$6*2$,而np.r_产生的结果是$2*6$

1
print('横向拼接:\n',np.r_[a1,a2])
横向拼接: [6 5 4 3 2 1 1 2 3 4 5 6]纵向拼接: [[6 1] [5 2] [4 3] [3 4] [2 5] [1 6]]

1.8 数组分解

1
exp = np.array([[-23,29,1],
横向分解为3个数组: [array([[-23], [ 2], [ -4]]), array([[ 29], [ 4], [-10]]), array([[ 1], [12], [ 7]])]纵向分解为3个数组: [array([[-23, 29, 1]]), array([[ 2, 4, 12]]), array([[ -4, -10, 7]])]

二、常用数组

在工作或者学习中,有些数组是我们常用的,利用numpy中的函数可以容易地产生这些数组

2.1 np.arange(起始数,终止数,间隔)

1
print(np.arange(1,10,1))
[1 2 3 4 5 6 7 8 9][ 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]

2.2 np.linspace(起始数,终止数,产生数的个数)

1
#在指定区间返回均匀间隔的数字
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.][-1. -0.89473684 -0.78947368 -0.68421053 -0.57894737 -0.47368421 -0.36842105 -0.26315789 -0.15789474 -0.05263158 0.05263158 0.15789474 0.26315789 0.36842105 0.47368421 0.57894737 0.68421053 0.78947368 0.89473684 1. ]

2.3 常用矩阵

1
print('元素都为1的方阵:\n',np.ones((3,3)))
元素都为1的方阵: [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]]元素都为0的方阵: [[ 0. 0. 0.] [ 0. 0. 0.] [ 0. 0. 0.]]单位阵: [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]]

2.4 np.tile()函数

该函数的作用是重复某个对象为一定的结构

1
short = np.arange(1,4,1)
[1 2 3][1 2 3 1 2 3 1 2 3]
1
small = np.eye(2)
[[ 1. 0.] [ 0. 1.]][[ 1. 0. 1. 0.] [ 0. 1. 0. 1.] [ 1. 0. 1. 0.] [ 0. 1. 0. 1.]]

2.5 np.meshgrid()函数

np.meshgrid函数在画三维图时常用,其含义是利用两个坐标轴的点形成一个平面

1
x = np.arange(-3,4,1)
[-3 -2 -1 0 1 2 3][-2 -1 0 1 2]
1
[X,Y] = np.meshgrid(x,y)
1
X #X是根据x按行产生 y的长度个的行
1
Y #Y是根据y按列产生 x的长度个的列

三、numpy常用常量

1
print('自然底数:',np.e)
自然底数: 2.718281828459045缺失值: nan无穷大: inf圆周率: 3.141592653589793

四、numpy随机数产生

1
print('一维正态随机数:\n',np.random.randn(5))
一维正态随机数: [-1.54889386 1.71266157 -1.21664674 0.11417545 0.60703329]二维正态随机数: [[ 0.16870831 0.72375413] [-0.28110209 0.71372129]]二维0-1均匀分布随机数: [[ 0.82010506 0.0401018 ] [ 0.92058936 0.4421662 ]]5个10-20的均匀随机整数: [19 17 19 13 11]二维均匀随机整数: [[42 23] [13 18]]

numpy.random函数

函数说明
seed随机数生成器的种子
permutation序列的随机排列或者随机排列的范围,不改变原数组
shuffle序列就地随机排列,改变原数组
rand均匀分布样本值
randint给定上下限随机产生整数
randn正态分布样本值
binomial二项分布样本值
normal正态分布样本值
betabeta分布样本值
chisquare卡方分布样本值
gammaGamma分布样本值
uniform[0,1)均匀分布样本值
choice从数组中随机选择若干个元素
1
a = np.arange(1,11,1)
[ 1 2 3 4 5 6 7 8 9 10]随机打乱a中的元素顺序: [ 3 6 10 2 8 4 7 1 9 5]
1
print(a)
[ 4 2 5 7 10 9 1 8 3 6]随机从a中选取5个元素: [3 9 2 6 3]

五、numpy矩阵性质

1
x = np.random.randint(1,10,(3,3))
原矩阵: [[6 7 8] [6 3 2] [1 6 7]]矩阵对角线: [6 3 7]矩阵上三角: [[6 7 8] [0 3 2] [0 0 7]]矩阵下三角: [[6 0 0] [6 3 0] [1 6 7]]矩阵的迹: 16矩阵的转置: [[6 6 1] [7 3 6] [8 2 7]]
1
x = np.random.randint(1,10,(3,3))
原矩阵: [[9 1 3] [4 3 4] [1 2 1]]矩阵元素向右循环移动2位: [[2 1 9] [1 3 4] [3 4 1]]

六、numpy矩阵运算

1
import numpy.linalg as la
1
x = np.random.randint(1,10,(3,3))
原矩阵: [[8 3 9] [2 4 9] [7 5 5]]矩阵的行列式: -203.0矩阵的逆: [[ 0.12315271 -0.14778325 0.04433498] [-0.26108374 0.11330049 0.26600985] [ 0.08866995 0.09359606 -0.12807882]]矩阵的特征值分解: (array([ 17.59463536, 3.11237519, -3.70701055]), array([[-0.67692023, -0.58963061, -0.32958687], [-0.47296268, 0.80602725, -0.67968899], [-0.56399052, 0.0515346 , 0.65528266]]))矩阵的奇异值分解: (array([[-0.67891 , 0.19378171, -0.70818773], [-0.51305088, -0.81519105, 0.26877938], [-0.52522377, 0.54581334, 0.65286123]]), array([ 18.05856915, 4.71111404, 2.38610244]), array([[-0.56117116, -0.37184853, -0.73946981], [ 0.79398735, 0.01053841, -0.60784293], [-0.23381833, 0.9282336 , -0.28932918]]))
1
x = np.random.randint(1,10,(3,3))
求解 Xβ=y 线性方程组解β为: [[-0.73684211] [ 0.31578947] [ 3.36842105]]

numpy.linalg函数

函数说明
diag以一维数组的形式返回方阵的对角线元素或将一维数组转化为方阵
dot、trace、det矩阵乘法、矩阵的迹运算、矩阵行列式
eig、inv、pinv方阵的特征值和特征向量、方阵的逆、矩阵的Moore-Penrose伪逆
qr、svd矩阵的QR分解、奇异值分解
solve解线性方程组$X\beta=y$,其中$X$为方阵
lstsq计算$X\beta=y$的最小二乘解

七、多项式曲线拟合

1
import matplotlib.pyplot as plt # 导入作图库 为了更好展示曲线拟合的结果

例如,对于下面的这些散点进行多项式拟合。观察散点的形态,采用直线取拟合

1
x = np.linspace(-10,10,100)
1
from numpy import polyfit,poly1d
1
coef_fit = polyfit(x, y, 1) #进行线性拟合 1代表的是多项式拟合的多项式的阶数 这里指的是线性拟合
1
plt.plot(x, y, 'rx',label='真实散点')

从上图可以看到,直线拟合的结果还是比较好的

1
f = poly1d(coef_fit) #也可以直接产生拟合的函数解析式
拟合函数: 2.016 x + 1.283

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多