一、numpy库的学习总计
安装numpy
python3 -m pip install -U pip更新pip
pip install numpy
安装方式II
pip install ipython
ipython –pylab
pylab模式下会自动导入SciPy,NumPy,Matplotlib模块
引入numpy
import numpy as py
使用numpy
arange()函数用于创建同类型多维数组(homogeneous multidimensional array)
用arange创建的数组使用type()查看类型为ndarray
reshape()函数用于重新构造数组成为其他维度数组
例如:np.arange(20).reshape(4,5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
arrry 数组相关属性:
ndim: 维度
shape: 各维度大小
size: 元素个数
dtype: 元素类型
dsize: 元素占位大小
生成特殊矩阵
全零矩阵:np.zeros()
注意:ones()和zeros()函数的第一个参数是一个指向数列的指针,不能直接是一个数列,例如上图报错情况
全一矩阵:np.ones(d,dtype=int)
默认生成浮点型,可通过第二个参数指定元素数据类型
随机数数组
np.random.rand(5)生成包含5个[0,1)区间的数的数组
数组计算
a = np.array([1.0, 2],[2, 4])
a
[[ 1. 2.]
[ 2. 4.]]
由于数组是【同质】的,python会自动将整型转换为浮点型
np.exp(a):自然常数e(约等于2.7)的a次方
np.sqrt(a):a的开方
np.square(a):a的平方
np.power(a,3):a的3次方
a.sum():所有元素之和
a.max():最大元素
a.min():最小元素
a.max(axis=1):每行最大
a.min(axis=0):每列最小
数组与矩阵(matrix)
注意:
矩阵是二维数组,矩阵乘法相求左侧矩阵列数等于右侧矩阵行数
数组可以是任意正整数维数,乘法要求两侧数组行列数均相同
相互转换
数组转矩阵
np.asmatrix(a)
np.mat(a)
直接生成
np.matrix(‘1.0 2.0;3.0 4.0’)
生成指定长度的一维数组
np.linspace(0,2,9):生成从0开始,到2结束,包含9个元素的等差数列
**数组元素访问
a = np.array([3.2, 1.5],[2.5, 4])
print a[0][1]
1.5
print a[0,1]
1.5
注意:
若b=a是将b和a同时指向同一个array,若修改a或者b的某个元素,a和b都会改变
若想a和b不会关联修改,则需要b = a.copy()为b单独生成一份拷贝
a:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
a[: , [1,3]]:访问a的所有行的2、4列
**访问符合条件的元素
a[: , 2][a[: , 0] > 5]
解释:
a [x] [y]表示访问符合x、y条件的a的元素,[: , 2]表示取所有行的第3列,[a[: , 0] > 5]表示取第一列大于5的行(即第3、4行),最终即表示取第3、4行的第3列,即得结果array([12, 17])这个“子”数组
numpy.where()查找符合条件的位置
例如:loc = np.where(a == 11)
print loc
(array([2]), array([1]))
结果是一个表示坐标的元组,元组第一个数组表示查询结果的行坐标,第二个数组表示结果的列坐标
print a[loc[0][0], loc[1][0]]
11
上式为通过位置反求元素11
注意:where求出的结果为元组,不能通过loc[x,y]的方式获取元素(该获取方式为数组的方式,因为元组没有索引),只能通过loc[x][y]的方式获取
数组其他操作
矩阵转置
a = np.random.rand(2,4)
a = np.transpose(a)将a数组转置
b = np.random.rand(2,4)
b = np.mat(b)
print b.T 转置矩阵
矩阵求逆
import numpy.linalg as nlg
a = np.random.rand(2,2)
a = np.mat(a)
ia = nlg.inv(a) 得逆矩阵
print a * ia
[[ 1. 0.]
[ 0. 1.]]
特征值和特征向量
a = np.random.rand(3,3)
eig_value, eig_vector = nlg.eig(a)
拼接矩阵(使用场景:循环处理某些数据后的操作)
按列拼接两个向量成一个矩阵
vstack
hstack
实例:
1 a = np.random.rand(2,2) 2 b = np.random.rand(2,2) 3 c = np.hstack([a,b]) 水平拼接 4 d = np.vstack([a,b]) 垂直拼接
缺失值
nan作为缺失值的记录
通过isnan判定
a = np.random.rand(2,2)
a[0, 1] = np.nan
print (np.isnan(a))
nan_to_num可用来将nan替换成0
pandas提供能指定nan替换值的函数
print(np.nan_to_num(a))
[[ 0.54266589 0.46546544 ]
[ 0.92468339 0.70599254]]
matplotlib的学习总结
实例1:基本三角函数图像实现
1 import numpy as np 2 import matplotlib.pyplot as plt 3 x = np.linspace(0, 6, 100) 4 y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8 5 plt.plot(x, y, 'k', color='r', linewidth=3, linestyle="-") 6 plt.show()
1 import matplotlib.pyplot as plt 2 import matplotlib 3 matplotlib.rcParams['font.family']='SimHei' 4 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 5 plt.plot([1,2,4], [1,2,3]) 6 plt.title("坐标系标题") 7 plt.xlabel('时间 (s)') 8 plt.ylabel('范围 (m)') 9 plt.xticks([1,2,3,4,5],[r'$pi/3$', r'$2pi/3$', r'$pi$', 10 r'$4pi/3$', r'$5pi/3$'])
11 plt.show()
实例2:带标识的坐标系
1 import matplotlib.pyplot as plt 2 import numpy as np 3 x = np.linspace(0, 10, 1000) 4 y = np.cos(2*np.pi*x) * np.exp(-x)+0.8 5 plt.plot(x,y,'k',color='r',label="$exp-decay$",linewidth=3) 6 plt.axis([0,6,0,1.8]) 7 ix = (x>0.8) & (x<3) 8 plt.fill_between(x, y ,0, where = ix, 9 facecolor='grey', alpha=0.25) 10 plt.text(0.5*(0.8+3), 0.2, r"$int_a^b f(x)mathrm{d}x$", 11 horizontalalignment='center') 12 plt.legend() 13 plt.show()
实例3:带阴影的坐标系
实例4:带阻尼衰减曲线坐标图绘制
1 ##e18.1PlotDamping.py 2 import numpy as np 3 import matplotlib.pyplot as plt 4 import matplotlib 5 matplotlib.rcParams['font.family']='SimHei' 6 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 7 def Draw(pcolor, nt_point, nt_text, nt_size): 8 plt.plot(x, y, 'k', label="$exp_decay$", color=pcolor, linewidth=3, linestyle="-") 9 plt.plot(x, z, "b--", label="$cos(x^2)$", linewidth=1) 10 plt.xlabel('时间(s)') 11 plt.ylabel('幅度(mV)') 12 plt.title("阻尼衰减曲线绘制") 13 plt.annotate('$cos(2 pi t) exp(-t)$', xy=nt_point, xytext=nt_text, fontsize=nt_size, 14 arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.1")) 15 def Shadow(a, b): 16 ix = (x>a) & (x<b) 17 plt.fill_between(x,y,0,where=ix,facecolor='grey', alpha=0.25) 18 plt.text(0.5 * (a + b), 0.2, "$int_a^b f(x)mathrm{d}x$", 19 horizontalalignment='center') 20 def XY_Axis(x_start, x_end, y_start, y_end): 21 plt.xlim(x_start, x_end) 22 plt.ylim(y_start, y_end) 23 plt.xticks([np.pi/3, 2 * np.pi/3, 1 * np.pi, 4 * np.pi/3, 5 * np.pi/3], 24 ['$pi/3$', '$2pi/3$', '$pi$', '$4pi/3$', '$5pi/3$']) 25 x = np.linspace(0.0, 6.0, 100) 26 y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8 27 z = 0.5 * np.cos(x ** 2)+0.8 28 note_point,note_text,note_size = (1, np.cos(2 * np.pi) * np.exp(-1)+0.8),(1, 1.4), 14 29 fig = plt.figure(figsize=(8, 6), facecolor="white") 30 plt.subplot(111) 31 Draw("red", note_point, note_text, note_size) 32 XY_Axis(0, 5, 0, 1.8) 33 Shadow(0.8, 3) 34 plt.legend() 35 plt.savefig('sample.JPG') 36 plt.show()
实例五多级雷达图绘制
lol人物能力值雷达图绘制
代码如下:
1 # -*- coding: utf-8 -*- 2 ##e19.1DrawRadar 3 import numpy as np 4 import matplotlib.pyplot as plt 5 import matplotlib 6 matplotlib.rcParams['font.family']='SimHei' 7 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 8 labels = np.array(['KDA', '综合', '生存', '发育', '输出', '推塔']) 9 nAttr = 6 10 data = np.array([8, 2, 7, 6, 4, 9]) #数据值 11 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False) 12 data = np.concatenate((data, [data[0]])) 13 angles = np.concatenate((angles, [angles[0]])) 14 fig = plt.figure(facecolor="white") 15 plt.subplot(111, polar=True) 16 plt.plot(angles,data,'bo-',color ='g',linewidth=2) 17 plt.fill(angles,data,facecolor='y',alpha=0.25) 18 plt.thetagrids(angles*180/np.pi, labels) 19 plt.figtext(0.52, 0.95, 'lol能力值雷达图', ha='center') 20 plt.grid(True) 21 plt.show()
效果图如下:
实例6:霍兰德人格分析雷达图绘制
1 #e19.2DrawHollandRadar 2 import numpy as np 3 import matplotlib.pyplot as plt 4 import matplotlib 5 matplotlib.rcParams['font.family']='SimHei' 6 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 7 radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)','企业型(E)','常规型(C)','现实型(R)']) 8 nAttr = 6 9 data = np.array([[0.63, 0.42, 0.35, 0.30, 0.30, 0.45], 10 [0.46, 0.65, 0.30, 0.60, 0.40, 0.55], 11 [0.49, 0.89, 0.35, 0.80, 0.72, 0.87], 12 [0.35, 0.35, 0.37, 0.55, 0.87, 0.32], 13 [0.34, 0.98, 0.89, 0.65, 0.42, 0.31], 14 [0.88, 0.31, 0.48, 0.64, 0.82, 0.31]]) #数据值 15 data_labels = ('工程师', '实验员', '艺术家', '推销员', '社会工作者','记事员') 16 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False) 17 data = np.concatenate((data, [data[0]])) 18 angles = np.concatenate((angles, [angles[0]])) 19 fig = plt.figure(facecolor="white") 20 plt.subplot(111, polar=True) 21 #plt.plot(angles,data,'bo-',color ='gray',linewidth=1,alpha=0.2) 22 plt.plot(angles,data,'o-', linewidth=1.5, alpha=0.2) 23 plt.fill(angles,data, alpha=0.25) 24 plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2) 25 plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20) 26 legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1) 27 plt.setp(legend.get_texts(), fontsize='small') 28 plt.grid(True) 29 plt.show()
效果图如下所示:
四、自定义手绘风
代码如下:
1 #e17.1HandDrawPic.py 2 from PIL import Image 3 import numpy as np 4 vec_el = np.pi/2.2 # 光源的俯视角度,弧度值 5 vec_az = np.pi/4. # 光源的方位角度,弧度值 6 depth = 10. # (0-100) 7 im = Image.open('E:\111.jpeg').convert('L') 8 a = np.asarray(im).astype('float') 9 grad = np.gradient(a) #取图像灰度的梯度值 10 grad_x, grad_y = grad #分别取横纵图像梯度值 11 grad_x = grad_x*depth/100. 12 grad_y = grad_y*depth/100. 13 dx = np.cos(vec_el)*np.cos(vec_az) #光源对x 轴的影响 14 dy = np.cos(vec_el)*np.sin(vec_az) #光源对y 轴的影响 15 dz = np.sin(vec_el) #光源对z 轴的影响 16 A = np.sqrt(grad_x**2 + grad_y**2 + 1.) 17 uni_x = grad_x/A 18 uni_y = grad_y/A 19 uni_z = 1./A 20 a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化 21 a2 = a2.clip(0,255) 22 im2 = Image.fromarray(a2.astype('uint8')) #重构图像 23 im2.save('E:\11.jpeg')
原图:
效果图:
五、自己的成绩分析雷达图
import numpy as np import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.family']='SimHei' matplotlib.rcParams['font.sans-serif'] = ['SimHei'] labels = np.array(['第一次', '第二次', '第三次', '第四次', '第五次']) nAttr = 5 data = np.array([20,20,20,20,20]) #数据值 angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False) data = np.concatenate((data, [data[0]])) angles = np.concatenate((angles, [angles[0]])) fig = plt.figure(facecolor="white") plt.subplot(111, polar=True) plt.plot(angles,data,'bo-',color ='g',linewidth=2) plt.fill(angles,data,facecolor='g',alpha=0.25) plt.thetagrids(angles*180/np.pi, labels) plt.figtext(0.52, 0.95, '郑志杰的公开课成绩分析', ha='center') plt.grid(True) plt.show()
效果图: