目录
最后编辑于:2020.02.05 12:30
Numpy库 Numpy库是Python的一种开源的数值计算扩展。
Numpy可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效很多。
据说Numpy将Pyhon变成了一种免费的更强大的Matlab系统。
本文介绍性文字转载自万旷网 。氦核感觉notebook形式更适合学习,有机会把丘比特文件给大家附上。
Numpy库包含了:
>
强大的N维数组对象 精密的函数 连接C/C++和Fortran代码的工具 常用的线性代数,傅里叶变换和随机数生成
氦核:惯用的导入法,最好延用。
一、数组array 数组array和列表list类似,但是数据array可以定义维度,且适合做数学代数运算
1.数组array生成 数据使用windapi提取。
1 2 3 4 5 from WindPy import *w.start() a = w.wsd("000001.SZ" , "close" , "2018-07-05" , "2018-07-11" , "" ) b = w.wsd("000002.SZ" , "close,open" , "2018-07-05" , "2018-07-11" , "" ) b
氦核:取的是收盘价和开盘价。
.ErrorCode=0
.Codes=[000002.SZ]
.Fields=[CLOSE,OPEN]
.Times=[20180705,20180706,20180709,20180710,20180711]
.Data=[[23.05,23.21,24.01,24.15,23.46],[23.02,23.34,23.37,24.2,23.48]]
1 2 3 4 5 6 7 8 9 a1 = np.array(a.Data[0 ]) a2 = np.array(b.Data) print('这是一个一维数组:\n' ,a1) print() print('这是一个二维数组:\n' ,a2) print() print('查看a1的长度:\n' ,len(a1)) print() print('查看a2的长度:\n' ,len(a2))
氦核:len可以求数组长度,指数组里有几个list。
这是一个一维数组:
[8.6 8.66 9.03 8.98 8.78]
这是一个二维数组:
[[23.05 23.21 24.01 24.15 23.46]
[23.02 23.34 23.37 24.2 23.48]]
查看a1的长度:
5
查看a2的长度:
2
array([[23.05, 23.21, 24.01, 24.15, 23.46],
[23.02, 23.34, 23.37, 24.2 , 23.48]])
23.21
1.2 数组array性质 1 2 3 4 '''数组元素整数转化为浮点数''' print('数组类型:' ,a1.dtype) float_arr = a1.astype(np.int) print('改变数组类型后:' ,float_arr.dtype)
氦核:dtype可以查看类型,astype可以转换类型。不同类型变换后会产生不同结果。
数组类型: float64
改变数组类型后: int32
1 2 3 4 '''字符串数字转化为浮点数''' numeric_string = np.array(['1.11' ,'2.22' ,'3.33' ]) print(numeric_string, numeric_string.dtype) print(numeric_string.astype(np.float),numeric_string.astype(np.float).dtype)
['1.11' '2.22' '3.33'] <U4
[1.11 2.22 3.33] float64
1 2 3 4 '''字符串数字转化为浮点数''' numeric_string = np.array(['1.11' ,'2.22' ,'3.33' ]) print(numeric_string, numeric_string.dtype) print(numeric_string.astype(np.float),numeric_string.astype(np.float).dtype)
['1.11' '2.22' '3.33'] <U4
[1.11 2.22 3.33] float64
1 2 3 4 5 6 7 8 9 10 11 print(a2) print() print('第二行第三列元素(第二行索引为1,第三列索引为2):\n' ,a2[1 ,2 ]) print() print('倒数第一行(注意索引为-1):\n' ,a2[-1 ,:]) print() print('第三列(索引为2):\n' ,a2[:,2 ]) print() print('a2形状:\n' ,a2.shape) print() print('a2形状重构:\n' ,a2.reshape(5 ,2 ))
[[23.05 23.21 24.01 24.15 23.46]
[23.02 23.34 23.37 24.2 23.48]]
第二行第三列元素(第二行索引为1,第三列索引为2):
23.37
倒数第一行(注意索引为-1):
[23.02 23.34 23.37 24.2 23.48]
第三列(索引为2):
[24.01 23.37]
a2形状:
(2, 5)
a2形状重构:
[[23.05 23.21]
[24.01 24.15]
[23.46 23.02]
[23.34 23.37]
[24.2 23.48]]
1 2 3 4 5 6 7 8 9 10 11 12 13 print('维度解锁:' ,a2.ravel()) print() print('按列求和:' ,a2.sum(axis=0 )) print() print('按列求积:' ,a2.prod(axis=0 )) print() print('全局最大值:' ,a2.max(),'全局最小值:' ,a2.min()) print() print('按行求最大值:' ,a2.max(axis=0 ),'按列求最小值:' ,a2.min(axis=1 )) print() print('按列求均值:' ,a2.mean(axis=0 )) print() print('按行求标准差:' ,a2.std(axis=0 ))
维度解锁: [23.05 23.21 24.01 24.15 23.46 23.02 23.34 23.37 24.2 23.48]
按列求和: [46.07 46.55 47.38 48.35 46.94]
按列求积: [530.611 541.7214 561.1137 584.43 550.8408]
全局最大值: 24.2 全局最小值: 23.02
按行求最大值: [23.05 23.34 24.01 24.2 23.48] 按列求最小值: [23.05 23.02]
按列求均值: [23.035 23.275 23.69 24.175 23.47 ]
按行求标准差: [0.015 0.065 0.32 0.025 0.01 ]
氦核:这些计算都是可以接受方向的。按列或按行。
1 2 3 4 5 6 7 print('原矩阵:\n' ,a2) print() print('按列求和:\n' ,a2.sum(axis=0 )) print() print('按行求均值:\n' ,a2.mean(axis=1 )) print() print('按行累加:\n' ,a2.cumsum(axis=1 ))
原矩阵:
[[23.05 23.21 24.01 24.15 23.46]
[23.02 23.34 23.37 24.2 23.48]]
按列求和:
[46.07 46.55 47.38 48.35 46.94]
按行求均值:
[23.576 23.482]
按行累加:
[[ 23.05 46.26 70.27 94.42 117.88]
[ 23.02 46.36 69.73 93.93 117.41]]
1 2 3 print('矩阵所有元素求指数:\n' ,np.exp(a2)) print() print('矩阵所有元素求根号:\n' ,np.sqrt(a2))
氦核:np.exp功能是“求e的幂次方”。
矩阵所有元素求指数:
[[1.02444302e+10 1.20219502e+10 2.67553422e+10 3.07759692e+10
1.54364896e+10]
[9.94166153e+09 1.36909381e+10 1.41078893e+10 3.23538868e+10
1.57483274e+10]]
矩阵所有元素求根号:
[[4.80104155 4.81767579 4.9 4.91426495 4.84355242]
[4.79791621 4.83114893 4.83425279 4.91934955 4.84561658]]
小数位数控制和取整
1 print('小数位数:\n' ,a1.round(decimals=2 ))
小数位数:
[8.6 8.66 9.03 8.98 8.78]
1 2 3 4 5 6 7 print('原数组:\n' ,a1) print() print('向上取整:\n' ,np.floor(a1)) print() print('向下取整:\n' ,np.ceil(a1)) print() print('四舍五入(控制小数为2位):\n' ,np.round(a1,2 ))
原数组:
[8.6 8.66 9.03 8.98 8.78]
向上取整:
[8. 8. 9. 8. 8.]
向下取整:
[ 9. 9. 10. 9. 9.]
四舍五入(控制小数为2位):
[8.6 8.66 9.03 8.98 8.78]
数组——一元函数
函数
说明
abs、fabs
计算整数、浮点数或复数的绝对值。对于非复数,使用fabs更快
sqrt、square、exp
计算各元素的平方根、平方、指数𝑒𝑥
log、log10、log2、log1p
自然对数、底数10的对数、底数2的对数、𝑙𝑛(1+𝑥)
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 2 3 c, r = np.array([1 ,2 ,3 ,4 ]), np.array([2 ,3 ,4 ,5 ]) print(c) print(r)
[1 2 3 4]
[2 3 4 5]
1 2 3 4 5 print('数组相加:' ,c + r) print('数组相乘:' ,c * r) print('数组乘方:' ,c **r) print('数组判断:' ,c >= 2 ) print('向量内积:' ,c.dot(r.T))
数组相加: [3 5 7 9]
数组相乘: [ 2 6 12 20]
数组乘方: [ 1 8 81 1024]
数组判断: [False True True True]
向量内积: 40
1 2 print('取两个数组中的较大值组成新的数组:' ,np.maximum(c,r)) print('取两个数组中的较小者组成新的数组:' ,np.minimum(c,r))
取两个数组中的较大值组成新的数组: [2 3 4 5]
取两个数组中的较小者组成新的数组: [1 2 3 4]
1 2 3 4 5 6 7 x1 = np.array([True ,False ,True ]) x2 = np.array([False ,False ,True ]) print(x1) print(x2) print(np.logical_and(x1,x2)) print(np.logical_or(x1,x2)) print(np.logical_xor(x1,x2))
氦核:逻辑运算一样很简单,logical_xor是异或运算。一般逻辑函数用于检验数组内容,筛选出需要的元素(通常得到的是位置)。可以完成“检查a中元素是否存在于b中”这样的问题。简便操作详细见下面集合运算。
[ 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 2 3 4 5 6 7 8 9 10 11 12 13 x = np.array([1 ,2 ,3 ,3 ,3 ,3 ,4 ,5 ,10 ,10 ,20 ,30 ]) y = np.array([100 ,20 ,40 ,10 ,3 ,2 ,1 ]) print('数组x中的唯一元素:\n' ,np.unique(x)) print() print('数组x和y的公共元素:\n' ,np.intersect1d(x,y)) print() print('数组x和y的并集:\n' ,np.union1d(x,y)) print() print('数组x中的元素是否包含于y:\n' ,np.in1d(x,y)) print() print('集合差_在x中而不在y中的元素:\n' ,np.setdiff1d(x,y)) print() print('只存在某个数组中,而不同时存在于两个数组中:\n' ,np.setxor1d(x,y))
数组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切片进阶
array([8.6 , 8.66, 9.03, 8.98, 8.78])
1 2 3 4 5 print(a1[::2 ]) print(a1[1 ::2 ])
氦核:上面片段中的2代表步长。
[8.6 9.03 8.78]
[8.66 8.98]
1 2 3 4 5 6 7 from WindPy import *w.start() w = w.wsd("000858.SZ" , "open,high,low,close,pct_chg" , "2018-07-05" , "2018-07-11" , "" ) w
氦核:开,高,低,收。
.ErrorCode=0
.Codes=[000858.SZ]
.Fields=[OPEN,HIGH,LOW,CLOSE,PCT_CHG]
.Times=[20180705,20180706,20180709,20180710,20180711]
.Data=[[71.69,69.9,71.58,73.57,71.2],[72.71,71.98,73.55,74.13,72.64],[69.7,68.88,70.4,72.08,70.93],[70.82,70.62,73.54,73.37,72.08],[0.16973125884014886,1.5822798147378172,4.134806003964902,-0.23116671199347652,-1.7582118031893383]]
1 2 w1 = np.array(w.Data) w1
array([[71.69 , 69.9 , 71.58 , 73.57 , 71.2 ],
[72.71 , 71.98 , 73.55 , 74.13 , 72.64 ],
[69.7 , 68.88 , 70.4 , 72.08 , 70.93 ],
[70.82 , 70.62 , 73.54 , 73.37 , 72.08 ],
[ 0.16973126, 1.58227981, 4.134806 , -0.23116671, -1.7582118 ]])
1 2 3 4 5 print('截取第1行第4,5个元素:\n' ,w1[0 , 3 :5 ]) print() print('截取第5行至最后,第5列至最后的元素:\n' ,w1[4 :, 4 :]) print() print('截取第3,5行,第1,3,5列\n' ,w1[2 ::2 , ::2 ])
截取第1行第4,5个元素:
[73.57 71.2 ]
截取第5行至最后,第5列至最后的元素:
[[-1.7582118]]
截取第3,5行,第1,3,5列
[[69.7 70.4 70.93 ]
[ 0.16973126 4.134806 -1.7582118 ]]
1.6 数组排序 1 2 3 4 5 6 from WindPy import *w.start() sy = w.wsd("000001.SZ" , "pct_chg" , "2018-07-05" , "2018-07-11" , "" ) sy
.ErrorCode=0
.Codes=[000001.SZ]
.Fields=[PCT_CHG]
.Times=[20180705,20180706,20180709,20180710,20180711]
.Data=[[-0.11614401858303243,0.6976744186046501,4.272517321016162,-0.5537098560354228,-2.2271714922049117]]
1 2 sy2 = np.array(sy.Data[0 ]) sy2
array([-0.11614402, 0.69767442, 4.27251732, -0.55370986, -2.22717149])
1 2 print('大于0元素所在的索引:\n' ,np.where(sy2>0 ))
大于0元素所在的索引:
(array([1, 2], dtype=int64),)
1 2 print('从小到大排序:\n' ,np.sort(sy2))
从小到大排序:
[-2.22717149 -0.55370986 -0.11614402 0.69767442 4.27251732]
1 print('排序后元素所在的原索引位置' ,np.argsort(sy2))
排序后元素所在的原索引位置 [4 3 0 1 2]
1.7 数组拼接
array([8.6 , 8.66, 9.03, 8.98, 8.78])
1 2 a3 = np.array(w.wsd("000858.SZ" , "close" , "2018-07-05" , "2018-07-11" , "" ).Data)[0 ] a3
array([70.82, 70.62, 73.54, 73.37, 72.08])
1 2 3 print('纵向拼接:\n' ,np.vstack((a1,a3))) print() print('横向拼接:\n' ,np.hstack((a1,a3)))
纵向拼接:
[[ 8.6 8.66 9.03 8.98 8.78]
[70.82 70.62 73.54 73.37 72.08]]
横向拼接:
[ 8.6 8.66 9.03 8.98 8.78 70.82 70.62 73.54 73.37 72.08]
使用np.r_和np.c_也可以实现拼接的功能
注意纵向拼接的时候,np.c_产生的结果是5∗2,而np.r_产生的结果是2∗5
1 2 3 print('横向拼接:\n' ,np.r_[a1,a3]) print() print('纵向拼接:\n' ,np.c_[a1,a3])
横向拼接:
[ 8.6 8.66 9.03 8.98 8.78 70.82 70.62 73.54 73.37 72.08]
纵向拼接:
[[ 8.6 70.82]
[ 8.66 70.62]
[ 9.03 73.54]
[ 8.98 73.37]
[ 8.78 72.08]]
1.8 数组分解 1 2 a4 = np.array(w.wsd("000858.SZ" , "close,open,low" , "2018-07-05" , "2018-07-11" , "" ).Data) a4
array([[70.82, 70.62, 73.54, 73.37, 72.08],
[71.69, 69.9 , 71.58, 73.57, 71.2 ],
[69.7 , 68.88, 70.4 , 72.08, 70.93]])
1 2 3 print('横向分解为5个数组:\n' ,np.hsplit(a4,5 )) print() print('纵向分解为3个数组:\n' ,np.vsplit(a4,3 ))
横向分解为5个数组:
[array([[70.82],
[71.69],
[69.7 ]]), array([[70.62],
[69.9 ],
[68.88]]), array([[73.54],
[71.58],
[70.4 ]]), array([[73.37],
[73.57],
[72.08]]), array([[72.08],
[71.2 ],
[70.93]])]
纵向分解为3个数组:
[array([[70.82, 70.62, 73.54, 73.37, 72.08]]), array([[71.69, 69.9 , 71.58, 73.57, 71.2 ]]), array([[69.7 , 68.88, 70.4 , 72.08, 70.93]])]
二、常用数组 在工作或者学习中,有些数组是我们常用的,利用numpy中的函数可以容易地产生这些数组。
2.1 np.arange(起始数,终止数,间隔) 1 2 3 4 print(np.arange(1 ,10 ,1 )) print() print(np.arange(1 ,10 ,0.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 2 3 4 5 print(np.linspace(1 ,10 ,10 )) print() print(np.linspace(-1 ,1 ,20 ))
[ 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 2 3 4 5 print('元素都为1的方阵:\n' ,np.ones((3 ,3 ))) print() print('元素都为0的方阵:\n' ,np.zeros((3 ,3 ))) print() print('单位阵:\n' ,np.eye(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 2 3 4 short = np.arange(1 ,4 ,1 ) print(short) long = np.tile(short,3 ) print(long)
[1 2 3]
[1 2 3 1 2 3 1 2 3]
1 2 3 4 small = np.eye(2 ) print(small) big = np.tile(small, (2 ,2 )) print(big)
[[1. 0.]
[0. 1.]]
[[1. 0. 1. 0.]
[0. 1. 0. 1.]
[1. 0. 1. 0.]
[0. 1. 0. 1.]]
三、Numpy常用常量 1 2 3 4 print('自然底数:' ,np.e) print('缺失值:' ,np.NaN) print('无穷大:' ,np.inf) print('圆周率:' ,np.pi)
自然底数: 2.718281828459045
缺失值: nan
无穷大: inf
圆周率: 3.141592653589793
四、Numpy随机数产生 1 2 3 4 5 6 7 8 9 print('一维正态随机数:\n' ,np.random.randn(5 )) print() print('二维正态随机数:\n' ,np.random.randn(2 ,2 )) print() print('二维0-1均匀分布随机数:\n' ,np.random.rand(2 ,2 )) print() print('5个10-20的均匀随机整数:' ,np.random.randint(10 ,20 ,5 )) print() print('二维均匀随机整数:\n' ,np.random.randint(10 ,50 ,(2 ,2 )))
一维正态随机数:
[-0.65240628 1.07426523 -0.86730208 -0.91339241 1.20066541]
二维正态随机数:
[[ 0.9663628 -1.32891237]
[-0.54264665 -1.29035995]]
二维0-1均匀分布随机数:
[[0.52527192 0.17719291]
[0.10103986 0.41623399]]
5个10-20的均匀随机整数: [17 18 14 12 11]
二维均匀随机整数:
[[38 24]
[24 38]]
numpy.random函数
函数
说明
seed
随机数生成器的种子
permutation
序列的随机排列或者随机排列的范围,不改变原数组
shuffle
序列就地随机排列,改变原数组
rand
均匀分布样本值
randint
给定上下限随机产生整数
randn
正态分布样本值
binomial
二项分布样本值
normal
正态分布样本值
beta
beta分布样本值
chisquare
卡方分布样本值
gamma
Gamma分布样本值
uniform
[0,1)均匀分布样本值
choice
从数组中随机选择若干个元素
1 2 3 4 5 a = np.arange(1 ,11 ,1 ) print(a) np.random.shuffle(a) print() print('随机打乱a中的元素顺序:\n' ,a)
[ 1 2 3 4 5 6 7 8 9 10]
随机打乱a中的元素顺序:
[10 3 2 6 1 9 8 7 4 5]
1 2 3 print(a) print() print('随机从a中选取5个元素:\n' ,np.random.choice(a,5 ))
[10 3 2 6 1 9 8 7 4 5]
随机从a中选取5个元素:
[5 3 8 9 4]
五、Numpy矩阵性质 1 2 3 4 5 6 7 8 9 10 11 12 x = np.random.randint(1 ,10 ,(3 ,3 )) print('原矩阵:\n' ,x) print() print('矩阵对角线:\n' ,np.diag(x)) print() print('矩阵上三角:\n' ,np.triu(x)) print() print('矩阵下三角:\n' ,np.tril(x)) print() print('矩阵的迹:\n' ,np.trace(x)) print() print('矩阵的转置:\n' ,x.T)
原矩阵:
[[4 3 6]
[2 7 1]
[2 3 8]]
矩阵对角线:
[4 7 8]
矩阵上三角:
[[4 3 6]
[0 7 1]
[0 0 8]]
矩阵下三角:
[[4 0 0]
[2 7 0]
[2 3 8]]
矩阵的迹:
19
矩阵的转置:
[[4 2 2]
[3 7 3]
[6 1 8]]
1 2 3 4 x = np.random.randint(1 ,10 ,(3 ,3 )) print('原矩阵:\n' ,x) print() print('矩阵元素向右循环移动2位:\n' ,np.roll(x,2 ))
原矩阵:
[[1 1 6]
[7 3 3]
[7 6 5]]
矩阵元素向右循环移动2位:
[[6 5 1]
[1 6 7]
[3 3 7]]
六、Numpy矩阵运算 1 2 import numpy.linalg as la
1 2 3 a5 = np.array(w.wsd("000001.SZ" , "close,open,low" , "2018-07-08" , "2018-07-11" , "" ).Data) a5
array([[9.03, 8.98, 8.78],
[8.69, 9.02, 8.76],
[8.68, 8.89, 8.68]])
1 2 3 4 5 6 7 8 9 print('原矩阵:\n' ,a5) print() print('矩阵的行列式:\n' ,la.det(a5)) print() print('矩阵的逆:\n' ,la.inv(a5)) print() print('矩阵的特征值分解:\n' ,la.eig(a5)) print() print('矩阵的奇异值分解:\n' ,la.svd(a5))
原矩阵:
[[9.03 8.98 8.78]
[8.69 9.02 8.76]
[8.68 8.89 8.68]]
矩阵的行列式:
0.0967539999999976
矩阵的逆:
[[ 4.31196643 1.11416582 -5.48607809]
[ 6.27984373 22.42801331 -28.98691527]
[-10.74374186 -24.08479236 35.28949708]]
矩阵的特征值分解:
(array([2.65036938e+01, 2.08824580e-01, 1.74815890e-02]), array([[-0.58362007, -0.78625042, -0.09211654],
[-0.57657184, 0.5886538 , -0.64732544],
[-0.57179763, 0.18787491, 0.75662693]]))
矩阵的奇异值分解:
(array([[-0.58355077, 0.78217367, -0.21834112],
[-0.5766266 , -0.58842029, -0.56680096],
[-0.57181314, -0.20485584, 0.79439526]]), array([2.65057682e+01, 2.11310491e-01, 1.72745790e-02]), array([[-0.57510827, -0.58571691, -0.57112711],
[ 0.81163598, -0.49595222, -0.30867203],
[-0.10245733, -0.64106715, 0.76061515]]))
numpy.linalg函数
函数
说明
diag
以一维数组的形式返回方阵的对角线元素或将一维数组转化为方阵
dot、trace、det
矩阵乘法、矩阵的迹运算、矩阵行列式
eig、inv、pinv
方阵的特征值和特征向量、方阵的逆、矩阵的Moore-Penrose伪逆
qr、svd
矩阵的QR分解、奇异值分解
solve
解线性方程组 $𝑋\beta = 𝑦$,其中$𝑋$为方阵
lstsq
计算$𝑋\beta = 𝑦$的最小二乘解
七、多项式曲线拟合 1 2 import matplotlib.pyplot as plt plt.style.use('ggplot' )
例如,对于下面的这些散点进行多项式拟合。观察散点的形态,采用直线取拟合
1 2 3 4 5 x = np.linspace(-10 ,10 ,100 ) y = 2 *x + 1 + np.random.randn(100 )*2 fig = plt.subplots(figsize=(14 ,8 )) plt.plot(x, y, 'rx' ) plt.show()
1 from numpy import polyfit,poly1d
1 2 coef_fit = polyfit(x, y, 1 ) coef_fit
array([1.96386726, 1.11375232])
1 2 3 4 5 fig = plt.subplots(figsize=(14 ,8 )) plt.plot(x, y, 'rx' ,label='真实散点' ) plt.plot(x, coef_fit[0 ] * x + coef_fit[1 ], 'k-' ,label='拟合直线' ) plt.legend(loc='best' ) plt.show()
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 30495 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 23454 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 25955 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 28857 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 25311 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 21512 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 30452 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:211: RuntimeWarning: Glyph 32447 missing from current font.
font.set_text(s, 0.0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 30495 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 23454 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 25955 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 28857 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 25311 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 21512 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 30452 missing from current font.
font.set_text(s, 0, flags=flags)
D:\anaconda\lib\site-packages\matplotlib\backends\backend_agg.py:180: RuntimeWarning: Glyph 32447 missing from current font.
font.set_text(s, 0, flags=flags)
从上图可以看到,直线拟合的结果还是比较好的(报错可能是汉字bug
1 2 f = poly1d(coef_fit) print('拟合函数:' ,f)
拟合函数:
1.964 x + 1.114
氦核:numpy库很有“大计算器”的味道了,其实不会用的时候再去查也可以,主要是应该了解有什么基础功能,否则就会出现“自己实现某些基础算法”的乌龙(某种意义上也是好事,笑)。一起加油吧。
(完)
本文链接:
https://konelane.github.io/2020/02/05/200205numpy/
-- EOF --
转载请注明出处 署名-非商业性使用-禁止演绎 3.0 国际(CC BY-NC-ND 3.0)