#!/usr/bin/env python # coding: utf-8 # # Numpy # In[1]: # numpy import numpy as np np.arange(10) # 0 ~ n-1的一维数组 # In[ ]: np.ones((2,3)) # 全1数组 # In[ ]: np.zeros((3,3),dtype=np.int32) # 全0数组 # In[ ]: np.eye(5) # 5 * 5 的对角线为1,其余为0的数组 # In[2]: x = np.ones([2,3,4]) print(x) x.shape # 数组的形状 # In[ ]: a = np.linspace(1,10,4) # low high 元素个数 b = np.linspace(1,10,4,endpoint=False) # 不包含high print(a) print(b) c = np.concatenate((a,b)) # 合并两个数组 print(c) # In[ ]: # 改变数组的形状 a = np.ones((2,3,4),dtype=np.int32) print(a) print(a.reshape((3,8))) # 不改变原数组 print(a.resize((3,8))) # 原数组被改变 # In[ ]: # 改变数组的类型 a = np.ones((2,3,4),dtype=np.int32) print(a) b = a.astype(np.float32) # print(b) # In[ ]: a = np.full((2,3,4),25,dtype=np.int32) # full 数组形状,填充元素 b = a.tolist() # 将ndarray转换成list print(a) print("======") print(b) # In[2]: # 数组的索引和切片 a = np.array([1,2,3,4,5,6,7,8,9,10]) print(a[0]) print(a[1:10:2]) # 起始索引 : 终止(不含) : 步长 # In[ ]: a = np.arange(24).reshape((2,3,4)) print(a) print("===========================") print("索引",a[1,2,3]) print(a[:,1,2]) print(a[:,:,:]) print(a[:,1:,::2]) # In[ ]: a = np.arange(24).reshape((2,3,4)) np.square(a) a.mean() # 所有元素的平均值 # In[ ]: get_ipython().run_cell_magic('html', '', "<img src='./DataAnalyze_img/numpy基础.png'' ,width=800 ,height=600>") # In[ ]: # csv文件的存取 # 存 np.savetxt(fname,array,fmt,delimiter) # 文件名,数组,存入的类型,元素之间的分隔符 # 取 np.loadtxt(fname,dtype,delimiter,) # 只适用于一,二维数组的存取 ------------------------------------- # a = np.arange(24).reshape((2,3,4)) # a.tofile("a.csv",sep=',',format='%d') np.fromfile(fname,dtype,count,sep) # 读入的元素个数,数据分割符 ------------------------------------- np.save(fname,array) or np.savez() np.load(fname) #适用于多维数组,但只会将多维数组的元素逐个存入,也就是变成一维数组,如果不指定数据分割符,就会按二进制存入,读取时是不含维度信息的,只会 #按一维数组读入 # In[ ]: # 随机数函数 np.random.rand(5,5) # 0 - 1 之间的随机数 # In[ ]: np.random.randn(5,5) # In[ ]: np.random.randint(100,200,(5,5)) # In[ ]: np.random.seed(10) # 种子函数 np.random.randint(100,200,(5,5)) np.random.seed(10) np.random.randint(100,200,(5,5)) # 两次生成的随机数组相同 # In[ ]: # 高级随机函数 a = np.random.randint(100,200,(3,3,3)) print(a) np.random.shuffle(a) a # In[ ]: np.random.permutation(a) # 同shuffle,但不改变原数组 # In[ ]: a = np.random.randint(100,200,(24,)) np.random.choice(a,(3,2),replace=False) # 随机抽取元素,组成新的数组,replace设置是否抽取已经被选择过的元素,p参数设置抽取概率 # In[ ]: # 统计函数 # In[ ]: a = np.arange(15).reshape(3,5) print(a) print(np.sum(a)) np.sum(a,axis=0) # In[ ]: np.mean(a) # 求平均值 # In[ ]: np.average(a,axis=0,weights=[10,5,1]) # 加权平均值 # In[ ]: np.std(a) # 标准差,均方差 各元素与平均值平方的平均值的平方根 # In[ ]: np.var(a) # 方差 # In[ ]: np.ptp(a) # 最大值与最小值之间的差 # In[ ]: np.median(a) # 中位数 # In[ ]: # 梯度函数 a = np.random.randint(1,10,(5,)) print(a) np.gradient(a) # 数组的梯度,即斜率,是该元素前一个与后一个元素的差,除以距离2 # In[ ]: b = np.random.randint(1,15,(3,5)) print(b) np.gradient(b) # n维数组返回n个数组,反应元素在n维反向上的梯度 # In[ ]: # 图像的数组表示及变换 from PIL import Image a = np.array(Image.open("./DataAnalyze_img/timg.jpg")) # png文件比jpg文件多一个维度,是透明度 print(a.shape) a = [255,255,255] - a im = Image.fromarray(a.astype("uint8")) im.save("./DataAnalyze_img/timg1.png") # In[ ]: # 图像手绘效果 a = np.asarray(Image.open('./DataAnalyze_img/timg4.jpg').convert('L')).astype('float') depth = 10. grad = np.gradient(a) grad_x , grad_y = grad grad_x = grad_x*depth/100 grad_y = grad_y*depth/100 A = np.sqrt(grad_x**2+grad_y**2+1.) uni_x = grad_x/A uni_y = grad_y/A uni_z = 1./A vec_el = np.pi/2.2 vec_az = np.pi/4. dx = np.cos(vec_el)*np.cos(vec_az) dy = np.cos(vec_el)*np.sin(vec_az) dz = np.sin(vec_el) b = 255*(dx*uni_x+dy*uni_y+dz*uni_z) b = b.clip(0,255) im = Image.fromarray(b.astype('uint8')) im.save('./DataAnalyze_img/timg3.jpg') # # Matplotlib # In[1]: import matplotlib.pyplot as plt # In[2]: plt.plot([1,2,3,4,5]) plt.xlabel("grade") # plt.axis() # 四个参数,分别是x轴起始和y轴起始 # plt.savefig('fname',dpi=600) # 文件名默认.png 图片质量,每英寸(in)中点的数量 1in = 2.54cm plt.show() # In[3]: # 一张主图中分成多个子图 import numpy as np import matplotlib.pyplot as plt def f(t): return np.exp(-t) * np.cos(2*np.pi*t) # 衰减函数 a = np.arange(0.0,5.0,0.02) plt.subplot(2,1,1) # 行,列,子图所在区域 plt.plot(a,f(a)) plt.subplot(2,1,2) plt.plot(a,np.cos(2*np.pi*a),'r--') plt.show() # In[1]: # 一张图中绘制多条线 import matplotlib.pyplot as plt import numpy as np import matplotlib # 方式一 #matplotlib.rcParams["font.family"] = "SimHei" # 默认不支持中文,修改字体,黑体 a = np.arange(25) b = np.random.randint(10,20,(25,)) c = d = e = # 方式一 #plt.ylabel("KW(千瓦)") # 方式二 plt.ylabel("KW(千瓦)",fontproperties="FangSong",fontsize=20) # x轴标签 plt.xlabel("日期",fontproperties="SimHei",fontsize=20) # y轴标签 plt.title("日用电量",fontproperties="SimHei",fontsize=20) # 标题 plt.text(10,40,r'$\mu=100$',fontsize=10) # $$ Latex 格式 一种排版格式 plt.plot(a,b,'ro-.',) # 颜色,标记风格,线条风格 plt.plot(b,b*2,'g.', plt.plot(c,b*3,'k^-') plt.plot(d,b*3,'k^-') plt.plot(e,b*3,'k^-') plt.grid(True) # 添加网格 plt.show() # In[4]: # 主图中绘制多张子图,并对其位置自设计 import matplotlib.gridspec as gridspec gs = gridspec.GridSpec(3,3) a = np.arange(15) b = np.arange(20,35) plt.subplot(gs[0,:]) plt.plot(a,b) plt.subplot(gs[1,:-1]) plt.plot(a,b) plt.subplot(gs[1:,2]) plt.plot(a,b) plt.subplot(gs[2,1]) plt.plot(a,b) plt.subplot(gs[2,0]) plt.plot(a,b) # In[ ]: # 绘制饼图 label = "A","B","C","D" size = [30,20,15,35] explode = (0,0,0.1,0) plt.pie(size,labels=label,explode=explode,shadow=True,startangle=90,autopct="%1.1f%%") plt.axis("equal") plt.show() # In[ ]: # 绘制直方图 mu,sigma = 100,20 a = np.random.normal(mu,sigma,size=100) # 生成正态分布随机数 plt.hist(a,40,density=0,histtype="stepfilled",facecolor='y',alpha=0.75) plt.title("Hist") plt.show() # In[ ]: # 使用面向对象的方法绘制散点图 plt.rcParams['axes.unicode_minus'] = False # 显示负号 fig,ax = plt.subplots() #默认111 ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o') ax.set_title("散点图",fontproperties="SimHei") plt.show() # In[ ]: # 绘制引力波 import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile rate_h,hstrain = wavfile.read(r"./DataAnalyze_img/H1_Strain.wav") rate_l,lstrain = wavfile.read(r"./DataAnalyze_img/L1_Strain.wav") reftime,ref_H1 = np.genfromtxt('./DataAnalyze_img/wf_template.txt').transpose() htime_interval = 1/rate_h ltime_interval = 1/rate_l htime_len = hstrain.shape[0]/rate_h htime = np.arange(-htime_len/2,htime_len/2,htime_interval) ltime_len = lstrain.shape[0]/rate_l ltime = np.arange(-ltime_len/2,ltime_len/2,ltime_interval) fig = plt.figure(figsize=(12,6)) plth = fig.add_subplot(221) plth.plot(htime,hstrain,'y') plth.set_xlabel('Time(seconds)') plth.set_label("H1 Strain") plth.set_title("H1 Strain") pltl = fig.add_subplot(222) pltl.plot(ltime,lstrain,'g') pltl.set_xlabel('Time(seconds)') pltl.set_label("L1 Strain") pltl.set_title("L1 Strain") pltref = fig.add_subplot(212) pltref.plot(reftime,ref_H1) pltref.set_xlabel('Time(seconds)') pltref.set_label("H1 Strain") pltref.set_title("Template") fig.tight_layout() plt.show() # In[6]: # 一张图中绘制多条线 import matplotlib.pyplot as plt import numpy as np import matplotlib # 方式一 #matplotlib.rcParams["font.family"] = "SimHei" # 默认不支持中文,修改字体,黑体 a = np.arange(25) b = np.random.randint(10,20,(25,)) # 方式一 #plt.ylabel("KW(千瓦)") # 方式二 x=np.arange(10) plt.ylabel("KW(千瓦)",fontproperties="FangSong",fontsize=20) # x轴标签 plt.xlabel("日期",fontproperties="SimHei",fontsize=20) # y轴标签 plt.title("日用电量",fontproperties="SimHei",fontsize=20) # 标题 plt.text(10,40,r'$\mu=100$',fontsize=10) # $$ Latex 格式 一种排版格式 plt.plot(a,b,'ro-.') # 颜色,标记风格,线条风格 plt.plot(a,b*2,'g.') plt.plot(a,b*3,'k^-') plt.legend(["a","b","c"],loc="upper left") # 添加图例 plt.grid(True) # 添加网格 plt.show() # # Pandas # In[ ]: # pandas是基于numpy的,但numpy注重数据的结构,而pandas注重数据的应用 # series类型,对应一维数组 # In[1]: import pandas as pd a = pd.Series([1,2,3,4,5]) # 生成自动索引 b = pd.Series([1,2,3,4,5],index=["a","b","c","d","e"]) # 自定义索引 print(a) print(b) # In[11]: a_dict = {"a":1,"b":2,"c":3,"d":4} a = pd.Series(a_dict) a.index # 索引 a.values # 元素 # 可以看出,Series是索引与元素的关联,并且自动索引和定义索引同时存在,但不能同时使用 # In[13]: # Series对象可以起一个名字 .name a_dict = {"a":1,"b":2,"c":3,"d":4} a = pd.Series(a_dict) a.name = "First_S" a.index.name = "索引列" # 给索引列起个名字 a # In[14]: # 两个series对象相加,会对其 a = pd.Series([1,2,3,4],index=["a","b","c","d"]) b = pd.Series([1,2,3,4],index=["c","d","e","f"]) a+b # Dataframe:带标签的多维数组,即拥有行列索引 # In[42]: import pandas as pd import numpy as np a = pd.DataFrame(np.arange(1,12,step=2).reshape(2,3)) print(a) #print(a.index) #print(a.columns) #print(a.values) a[0] # 获取某一列数据 a.loc[1] # 获取某一行数据 a.iloc(0) # <pandas.core.indexing._iLocIndexer at 0x23485f4f2c8> # In[55]: # 数据类型操作,对索引进行重排 a = pd.DataFrame(np.arange(24).reshape(3,8)) a.reindex(index = [2,1,0]) # 对列索引重排序 a.reindex(columns=[7,6,5,4,3,2,1,0]) a.reindex(index = [0,1,2,3],fill_value = 10) # 对NaN进行填充 method填充方法,ffill向前填充,bfill向后 # 操作索引,向索引中插入 append diff intersection 交集 union并集 delete删除 new_co = a.columns.insert(1,"8") # 位置,值 a.reindex(columns=new_co,fill_value=10) # 使用drop删除指定索引 a.drop([0]) # axis = 1删除列 # In[65]: #数据类型运算add sub mul div +-*/ a = pd.DataFrame(np.arange(24).reshape(3,8)) b = pd.DataFrame(np.arange(24).reshape(4,6)) a.add(b,fill_value=10) # fill_value 替代NaN之后参与运算 # In[64]: # 比较运算,必须同维度,不进行补齐操作 a = pd.DataFrame(np.arange(24).reshape(3,8)) b = pd.DataFrame(np.arange(24,0,-1).reshape(3,8)) a < b # In[ ]: # 排序 #对索引排序,DataFrame.sort_index() #对元素排序,Dataframe.sort_values() # In[ ]: # 统计分析,dataframe.describe