-
numpy.array的數據結構只能有一種數據類型
不像list可以存放多種數據類型查看全部 -
keywords: 開源????數據計算擴展
functions: ndarray????多維操作????線性代數
查看全部 -
python數據分析包
python數據分析重要的幾個庫:numpy、scipy、matplotlib、pandas、-scikit-learn、Keras。
開發工具:Anaconda
查看全部 -
#coding:utf-8 import?numpy?as?np from?pylab?import?* ##插值 x=np.linspace(0,1,10) y=np.sin(2*np.pi*x) from?scipy.interpolate?import?interp1d li=interp1d(x,y,kind='cubic') x_new=np.linspace(0,1,50) y_new=li(x_new) figure() plot(x,y,'r') plot(x_new,y_new,'k') plt.show() print(y_new)
查看全部 -
import?numpy?as?np def?main(): ????##積分 ????from?scipy.integrate?import?quad,dblquad,nquad#引入積分模塊 ????print?(quad(lambda?x:np.exp(-x),0,np.inf))#0到無窮大的積分,返回的是一個值和誤差 ????print?(dblquad(lambda?t,x:np.exp(-x*t)/t**3,0,np.inf,lambda?x:1,lambda?x:np.inf))#二元積分,兩個參數t,x,先定義t的取值范圍(常數),再定義x的取值范圍(相當于t的函數) ????def?f(x,y):##n維積分 ????????return?x*y ????def?bound_y():#定義y的邊界 ????????return?[0,0.5] ????def?boundx(y):#定義x的邊界 ????????return?[0,1-2*y] ????print?(nquad(f,[boundx,bound_y])) if?__name__=='__main__': ????main()
查看全部 -
###子圖與多種圖形繪制 fig=plt.figure() ax=fig.add_subplot(3,3,1) n=128 X=np.random.normal(0,1,n)#生成隨機數 Y=np.random.normal(0,1,n)#生成隨機數 T=np.arctan2(Y,X)#T用于上色 #?plt.axes([0.025,0.025,0.95,0.95])#指定顯示范圍 ax.scatter(X,Y,s=75,c=T,alpha=.5) plt.xlim(-1.5,1.5),plt.xticks([])#指定x軸范圍 plt.ylim(-1.5,1.5),plt.yticks([]) plt.axis() plt.title('scatter') plt.xlabel('x') plt.xlabel('y') #?plt.show() ###柱狀圖 ax=fig.add_subplot(332) n=10#10個點 X=np.arange(n)# Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)#構造0到1之間的隨機數 Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n) ax.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')#+Y1就是將Y1放在上,-Y2將Y2放在下,配置柱體顏色及邊緣顏色 ax.bar(X,-Y2,facecolor='#ff9999',edgecolor='white') for?x,y?in?zip(X,Y1):#給Y1添加注釋,ha是豎直位置,va是水平位置 ????plt.text(x+0.4,y+0.05,'%.2f'%?y,ha='center',va='bottom') for?x,y?in?zip(X,Y2): ????plt.text(x+0.4,-y-0.05,'%.2f'%?y,ha='center',va='top') plt.title('Bar') #?plt.show() ###餅圖 ax=fig.add_subplot(333) n=20 Z=np.ones(n) Z[-1]*=2 ax.pie(Z,explode=Z*0.05,colors=['%f'%(i/float(n))?for?i?in?range(n)], ????????labels=['%.2f'%(i/float(n))?for?i?in?range(n)])#explode表示每個扇形離中心的距離,color設置成每個扇形都有不同的顏色,這里是灰度圖 plt.gca().set_aspect('equal')#設置為正圓而非橢圓,否則會隨著畫幅的大小發生形變 plt.xticks([]) plt.yticks([]) #?plt.show() ###極坐標圖 fig.add_subplot(334,polar=True) n=20 theta=np.arange(0.0,2*np.pi,2*np.pi/n) redii=10*np.random.rand(n) plt.polar(theta,redii) #?plt.show() ###熱力圖 fig.add_subplot(335) from?matplotlib?import?cm data=np.random.rand(3,3) cmap=cm.Blues map=plt.imshow(data,interpolation='nearest',cmap=cmap,aspect='auto',vmin=0,vmax=1) #?plt.show() ###3D圖 from?mpl_toolkits.mplot3d?import?Axes3D ax=fig.add_subplot(336,projection='3d') ax.scatter(1,1,3,s=100) #?plt.show() ###熱區圖 fig.add_subplot(313) def?f(x,y): ????return(1-x/2+x**5+y**3)*np.exp(-x**2-y**2) n=255 x=np.linspace(-3,3,n) y=np.linspace(-3,3,n) X,Y=np.meshgrid(x,y) plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot) plt.savefig('F:\python_codes\matplotlib_exampls.png') plt.show()
查看全部 -
###基本線圖繪制 import?matplotlib.pyplot?as?plt x=np.linspace(-np.pi,np.pi,256,endpoint=True) c,s=np.cos(x),np.sin(x) plt.figure(1) plt.plot(x,c,color='blue',linewidth=1.0,linestyle='-',label='COS',alpha=0.5) plt.plot(x,s,'r*',label='SIN') plt.title=('COS&SIN') ax=plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') ax.spines['left'].set_position(('data',0))#左邊線的位置移到數據為0的地方 ax.spines['bottom'].set_position(('data',0))#將下邊線的位置移到數為0的地方 plt.legend(loc='upper?left') plt.grid() #?plt.axis([-1,1,-0.5,1])#指定顯示范圍,前兩個數指定橫軸范圍,后兩個數指定縱軸顯示范圍 plt.fill_between(x,np.abs(x)<0.5,c,c>0.5,color='green',alpha=0.25)#進行綠色填充 t=1 plt.plot([t,t],[0,np.cos(t)],'y',linewidth=3,linestyle='--')#加一條與y軸平行的虛豎線 plt.annotate('cos(1)',xy=(t,np.cos(1)),xycoords='data',xytext=(+10,+30), ?????????????textcoords='offset?points',arrowprops=dict(arrowstyle='-'))#給上面那條虛豎線加(相對位置)注釋 plt.show()
查看全部 -
python數據分析:
? ? ? ? ? ? ? numpy:數據結構基礎
? ? ????????? scipy:強大的科學計算方法(矩陣分析,信號分析,數理分析....)
? ? ? ? ? ? ? matplotlib:豐富的可視化套件
????????????? pandas:基礎數據分析套件
????????????? scikit-learn:強大的數據分析建模庫
查看全部 -
#encoding=utf-8 ''' Keras 另一種機器學習模型人工神經網絡 人工神經網絡有兩個比較著名的框架,一個是誕生于LISA?lab的Theano,一個是谷歌開源的Tensorflow Keras是二者的高層應用API,簡化了構建人工神經網絡的步驟,讓人工神經網絡更容易實現 Windows下的Tensorflow還不是很成熟,所以接下來的實例中采用基于Theano的Keras 官網:https://keras.io/ 1、人工神經網絡簡單介紹Neural?Net 人工神經網絡的是一種機器學習運算模型 計算學習的運算模型本質上來說就是構造一種映射函數,人工神經網絡也不例外 從數學上可以證明,人工神經網絡可以映射成所有的非線性函數 神經網絡由大量的節點(或者我們可以稱之為神經元)直接相互連接構成的 通過對節點的輸入進行加權求和,這里的節點的輸入不一定是網絡的輸入,這里的權值就是模型所需要訓練的參數,最后通過一個非線性函數,實現對模型的非線性處理 常用的非線性函數:sigmoid、thanh、ReLU、softplus 人工神經網絡一般分為輸入層(Input?layer)、隱含層(Hidden?layer)、輸出層(Output?layer) 層與層之間相互連接,一般情況下同一層以內是不進行連接的,當然也有特殊情況比如RNN節點對自己進行反饋連接 一般的數據分析中,隱含層只有一層就夠了,如果隱含層有很多層的就是深度學習網絡(其參數計算過程與淺層神經網絡的訓練過程不太一樣) 2、keras實現人工神經網絡Keras?Installation?&?Neural?Network?with?Keras Installation:因為Anaconda不自帶,所以需要額外安裝 1、打開Anaconda命令行prompt 2、輸入命令conda?install?mingw?libpython 3、輸入命令pip?install?keras(windows下會先安裝theano再安裝keras) 然后使用pycharm運行程序一次報錯No?module?named?tensorflow 這里是因為如果使用theano下的keras需要指定 只要運行過keras就會在電腦有c:\user\電腦名字\keras\keras.jason 備份之后修改這個文件,修改兩處,修改為"image_dim_ordering":"th"和"backend":"theano",保存關掉 再運行提示用的是Theano客戶端(Using?Theano?backend)就成功了 ''' import?numpy?as?np from?keras.models?import?Sequential#Sequential可以認為是人工神經網絡各個層的容器 from?keras.layers?import?Dense,Activation#Dense表示那些求和的層,Activation就是激活函數 from?keras.optimizers?import?SGD#這里指的是隨機梯度下降算法 def?main(): ????from?sklearn.datasets?import?load_iris#繼續使用上一節的iris數據集 ????iris=load_iris() ????#由于神經網絡用的是分類器,所以需要把序列進行標簽化 ????print(iris["target"])#輸出的結果只有三種要么0要么1要么2 ????from?sklearn.preprocessing?import?LabelBinarizer#進行標簽化 ????print(LabelBinarizer().fit_transform(iris["target"])) ????#下一步分成訓練集和測試集,并進行標簽化處理 ????train_data,?test_data,?train_target,?test_target?=?train_test_split(iris.data,?iris.target,?test_size=0.2,random_state=1) ????labels_train=LabelBinarizer().fit_transform(train_target) ????labels_test?=?LabelBinarizer().fit_transform(test_target) ????#下一步構建神經網絡層 ????model=Sequential( ????????[ ????????????Dense(5,input_dim=4),#輸出有5個,輸入有4個,定義四個屬性值 ????????????Activation("relu"),#激活函數是relu ????????????Dense(3),#下一個輸入就是上一層的輸出,一共5個這里可以省略了,只定義3個它的輸出,這里是012三個label ????????????Activation("sigmoid"),#激活函數選擇sigmoid ????????] ????) ????#還可以使用另一種方式定義結構,先定義一個Sequential,然后一層一層往里加也是可以的 ????#?model=Sequential() ????#?model.add(Dense(5,input=4)) ????#下面定義一個隨機梯度下降算法的優化器 ????sgd=SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)#lr因子,decay表示遠離弧長,momentum實質因子 ????model.compile(optimizer=sgd,loss="categorical_crossentropy")#指定優化器optimizer,隱身函數loss ????model.fit(train_data,labels_train,nb_epoch=200,batch_size=40)#用訓練數據進行訓練,注意這里用的是labels_train ????#nb_epoch表示訓練多少輪,batch_size表示訓練一批共多少個數據 ????#接下來可以預測 ????print(model.predict_classes(test_data))#輸入測試集 ????#還可以用上一節講到的混淆矩陣和準確率 ????#模型比較大的話,參數訓練可能會消耗比較多的時間,可以把這些因子存下來,以便下次再用 ????model.save_weight("./data/w")#保存到指定目錄 ????model.load_weight("./data/w")#下一次直接讀取出來 if?__name__=='__main__': ????main()
查看全部 -
##encoding=utf-8 ''' scikit-learn?是基于python的數據挖掘建模和機器學習的工具包 可以非常方便的實現分類、回歸、降維等數據挖掘和機器學習的常用的操作 是基于python的高級數據分析中非常重要的工具包 官網:http://scikit-learn.org/ 也是開源軟件,可以在github上找到開源的代碼 Github:https://github.com/scikit-learn/scikit-learn 1、機器學習與決策樹Machine?learning&Decision?Tree 2、scikit-learn實現決策樹Realizing?Decision?Tree 機器學習 權威解釋:計算機程序如何隨著經驗積累自動提高性能 實際上,機器學習模擬的是人的學習,人做出決定的時候是基于以往的經驗 機器的經驗是歷史數據,本質是函數 例如:垃圾郵件檢測 是否群發或者郵件內容是否包含鏈接是判斷是否是垃圾郵件的重要因子,我們事先告訴機器哪些是垃圾郵件哪些不是 基于我們定義的屬性以及定義需要用到的數據,就可以得到一個判斷郵件是否是垃圾郵件的模型 下次輸入參數的時候,機器可以根據訓練好的模型(或者可以稱為一個函數)作出判斷 這其中最基礎的就是數據,對做決定起著最重要的關鍵作用的就是機器學習算法 機器學習:因子----》結果 結果:不打標記----》無監督學習(例如:對植物的分類,不知道屬性是什么,只是簡單的聚類) ???????打標記----》監督學習(例如垃圾郵件檢測,我們會告訴機器到底是不是垃圾郵件,需要打標記) ???????????????????????如果打標記的數據結果是有限離散的----》分類算法 ???????????????????????如果打標機的數據結果是連續的----》回歸算法 決策樹:監督學習??樹形結構????? ?????????每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別 ?????????例如是否出去玩,天氣是sunny有2個出去玩3個不出去玩,如果是rain有3個出去玩2個不出去玩,如果晴天的情況下再看濕度 ??????????????可以利用信息熵的概念H(U)=E[-logpi],所有概率*log概率的和結果取負值 ??????????????把原始數據集分類成幾部分之后可以得到新的信息熵,葉子信息熵=本節點算法*(葉子實例集個數占上節點總個數的比值) ??????????????葉子信息熵和上節點信息熵差值最大的當做判斷條件 ''' #scikit-learn?實現決策樹 #?Iris數據集,多重變量數據集 #?1、花萼長度;2花萼寬度;3、花瓣長度;4、花瓣寬度;通過這四種屬性判斷出鳶尾屬于哪個種類 #?5、種類:Iris?Setosa(山鳶尾)、Iris?Versicolour(雜色鳶尾)、Virginica(維吉尼亞鳶尾) #數據挖掘和機器學習大致分為三個步驟:1數據預處理2數據建模3結果驗證 import?numpy?as?np import?pandas?as?pd def?main(): ????#Pre-processing ????from?sklearn.datasets?import?load_iris ????iris=load_iris() ????print(iris)#結果有個data屬性就是四種屬性值共150個值,target是標注共三類 ????print(len(iris["data"]))#數據預處理有很多種,比如降維處理,由于鳶尾數據比較規則,所以只進行一步 ????from?sklearn.cross_validation?import?train_test_split ????train_data,test_data,train_target,test_target=train_test_split(iris.data,iris.target,test_size=0.2,random_state=1) ????#把數據分為驗證數據和測試數據,比例是test_size設置為0.2,即驗證數據集占整體20%,random_state=1表示隨機的選擇 ????#上面表示預處理結束,下面進行建模 ????#Model ????from?sklearn?import?tree#引入決策樹 ????clf=tree.DecisionTreeClassifier(criterion="entropy")#建立一個決策樹分類器,標準選擇entropy ????clf.fit(train_data,train_target)#用訓練集進行訓練,用train_data和train_target建立了一種決策樹關系 ????y_pred=clf.predict(test_data)#用test_data進行預測 ????#sklearn大多數的模型都會有fit(表示建立模型)和predict(表示預測)結構 ????#下面開始驗證 ????#Verify?用兩種方法進行驗證1準確率2混淆矩陣 ????from?sklearn?import?metrics ????print(metrics.accuracy_score(y_true=test_target,y_pred=y_pred))#得結果96.6%表示準確率比較高 ????#y_true表示真實的值,y_pred右邊錄入預測值 ????print(metrics.confusion_matrix(y_true=test_target,y_pred=y_pred)) ????#混淆矩陣的橫軸表示實際值,縱軸表示預測值,最理想情況下是對角矩陣,兩邊都是0 ????#決策樹可以直接輸出到文件 ????with?open("./data/tree.dot","w")?as?fw: ????????tree.export_graphviz(clf,out_file=fw) if?__name__=='__main__': ????main()
查看全部 -
#encoding=utf-8 ''' pandas?數據分析庫 是為了解決數據分析任務而創建的一種基于numpy的工具 納入了大量的庫和一些標準的數據模型,提供了非常高效的操作大型數據集的方法,提供了大量使我們快速的便捷的處理數據的函數 使得python成為廣泛使用的高效的數據環境 官網:http://pandas.pydata.org ''' import?numpy?as?np import?pandas?as?pd from?pylab?import?* def?main(): ????#?1、pandas基礎數據結構Series?&?DataFrame ????s=pd.Series([i*2?for?i?in?range(1,11)])#series是pandas當中一個基本的數據結構,填入數組1~10 ????print(type(s))#得<class?'pandas.core.series.Series'> ????dates=pd.date_range("20170301",periods=8)#periods表示8天,下面是第二個數據結構,dataframe ????df=pd.DataFrame(np.random.randn(8,5),index=dates,columns=list("ABCDE")) ????#定義8行5列隨機數,index是主鍵(索引),columns表示屬性命名,這里list將字符串序列化可以得到一個數組 ????print(df) ????#dataframe還有下面這種定義方式,分別定義各個屬性的值 ????#?df=pd.DataFrame({"A":1,"B":pd.Timestamp("20170301"),"C":pd.Series(1,index=list(range(4)),dtype="float32"),\ ????#?????"D":np.array([3]*4,dtype="float32"),"E":pd.Categorical(["police","student","teacher","doctor"])}) ????#?print(df) ????#2、pandas基本操作Basic?&?Select?&?Set ????#basic ????print(df.head(3))#head就是打印出前幾行 ????print(df.tail(3))#tail就是打印出后幾行 ????print(df.index)#可以直接打印出dataframe的index ????print(df.values)#values已經是數組了 ????print(df.T)??#?矩陣轉置 ????#print(df.sort(columns="C"))??#?排序,可以針對某一列進行排序,升序,index也變了 ????print(df.sort_index(axis=1,ascending=False))??#?axis=1表示通過屬性值進行排序,ascending=False表示進行?降序 ????print(df.describe())??#?打印出所有屬性值的數量,可大致了解數據 ????#select ????print("下面開始學select") ????print(type(df["A"]))??#得<class?'pandas.core.series.Series'>,dataframe由各個series組成的,series是dataframe的一個特例,所以操作通用 ????print(df[:3])??#?數組中可以直接這么用,dataframe也可以用下標進行切片 ????print(df["20170301":"20170304"])??#用index進行切片 ????print(df.loc[dates[0]])#更為通用的可以用loc函數進行處理 ????print(df.loc["20170301":"20170304",["B","D"]])#進行多維度的進行選擇,取20170301到20170304的數據且B列到D列的數據 ????print(df.at[dates[0],"C"])#也可以通過at指定特定的一個值 ????#print(df.at[20170301,"C"])?但這樣寫不行 ????print("上面通過索引進行選擇,下面通過下標進行選擇")#通過命令iloc ????print(df.iloc[1:3,2:4])#1到3行且2到4列,左包含右不包含 ????print(df.iloc[1,4])#指定一個 ????print(df.iat[1,?4]) ????print("有條件語句") ????print(df[df.B>0][df.A<0])#注意這里是df.B不能直接寫成B ????print(df[df>?0])#表里>0的元素直接返回數,<0的元素返回NaN ????print(df[df["E"].isin([1,2])])#表示數值是不是在后面的范圍里,因為表里都是浮點數,所以應該返回空即Index:?[] ????#set ????print("對dataframe屬性進行設置修改") ????s1=pd.Series(list(range(10,18)),index=pd.date_range("20170301",periods=8)) ????df["F"]=s1 ????print(df)#可得新加了屬性F一列 ????df.at[dates[0],"A"]=0 ????print(df) ????df.iat[1,1]=1 ????df.loc[:,"D"]=np.array([4]*len(df))#D列全賦成4,這里需要添加一個數組 ????print(df) ????df2=df.copy() ????df2[df2>0]=-df2#把所有>0的數變成負的,于是表里所有數都變成負數了 ????print(df2) ????#3、pandas缺失值處理Missing?Data?Processing ????#Missing?Values ????print("Missing?Values") ????df1=df.reindex(index=dates[:4],columns=list("ABCD")+["G"]) ????#定義的df1取df的前四行,columns取ABCD列且加一個G列 ????df1.loc[dates[0]:dates[1],"G"]=1#給G列的第一行第二行進行賦值成1 ????print(df1)#其中有NaN值,也就是所謂空值 ????#缺失的處理方式有兩種,一種是直接丟棄,另一種是進行填充,包括填充固定值以及插值(可參考scipy中插值算法) ????print(df1.dropna())#帶有NaN的兩行數據沒了 ????print(df1.fillna(value=2)) ????#4、pandas表統計與整合?數據融合和形狀定義Merge&Reshape ????#Statistic ????print("統計方面的應用") ????print(df.mean())#求所有屬性的均值,返回結果的屬性就是series ????print(df.var())??#求方差 ????s=pd.Series([1,2,4,np.nan,5,7,9,10],index=dates) ????print(s) ????print(s.shift(2))#把所有的值移位2個,而后面的值不會補到前面,前面的值為NaN ????print(s.diff())#不填數字表示一階,遞減的結果,第一個數字前面沒有,所以減去的結果是NaN ????print(s.value_counts())#每一個值在series當中出現的次數,繪制直方圖比較方便 ????print(df.apply(np.cumsum))#通過apply直接填入函數,cumsum表示后面所有的值都是前面的累加值,參考D列 ????print(df.apply(lambda?x:x.max()-x.min()))#還可以自定義函數,打印每個屬性的最大值和最小值的差,即極差 ????#Concat ????print("表格拼接和類sql的操作") ????pieces=[df[:3],df[-3:]] ????print(pd.concat(pieces))#拼接df的前三行和df的后三行 ????left=pd.DataFrame({"key":["x","y"],"value":[1,2]})#key和value是兩個屬性 ????right=pd.DataFrame({"key":["x","z"],"value":[3,4]}) ????print("LEFT:",left) ????print("RIGHT:",right) ????print(pd.merge(left,right,on="key",how="left"))#類似sql中的join函數 ????#?保留了左邊的x和y,根據key屬性拼接,拼接方式how是left,默認為inner會去掉所有不同的,也可以是outer,所有值都會有 ????df3=pd.DataFrame({"A":["a","b","c","b"],"B":list(range(4))}) ????print(df3.groupby("A").sum())#按照A屬性分類,將B聚合 ????#Reshape ????print("透視功能,交叉分析,透視表") ????import?datetime ????df4=pd.DataFrame({'A':['one','one','two','three']*6,#這表格有24行 ??????????????????????'B':['a','b','c']*8, ??????????????????????'C':['foo','foo','foo','bar','bar','bar']*4, ??????????????????????'D':np.random.randn(24), ??????????????????????'E':np.random.randn(24), ??????????????????????'F':[datetime.datetime(2017,i,1)?for?i?in?range(1,13)]+#F屬性元素都是拼接來的 ??????????????????????????[datetime.datetime(2017,?i,?15)?for?i?in?range(1,?13)]}) ????print(pd.pivot_table(df4,values="D",index=["A","B"],columns=["C"]))#透視交叉表的命令是pivot_table ????#對df4進行操作,輸出值是D,賦值項是A和B,列值是C,F沒用到即為空 ????#5、pandas時間序列、圖形繪制和文件操作Time?Series?&?Graph?&?Files ????#Time?Series ????print("時間序列") ????t_exam=pd.date_range("20170301",periods=10,freq="S")#periods定義有多少個時間段,freq參數定義為s表示秒 ????print(t_exam) ????#Graph ????print("繪圖功能")#除了用matplotlib實現,pandas可自己實現畫圖 ????ts=pd.Series(np.random.randn(1000),index=pd.date_range("20170301",periods=1000)) ????ts=ts.cumsum() ????ts.plot() ????show() ????#File ????print("文件操作") ????df6=pd.read_csv("./data/test.csv") ????print("Csv",df6) ????df7?=?pd.read_excel("./data/test.xlsx","Sheet1") ????print("Excel",df7) ????df6.to_csv("./data/test2.csv") ????df7.to_excel("./data/test2.xlsx") if?__name__=='__main__': ????main()
查看全部 -
#encoding=utf-8 ''' 因為python的數據類型比較靈活,[]內可以放下各種,但每次計算前先要判斷所以速度較慢 numpy中可以把list內容指定為某一種數據類型,所以比較快 ''' import?numpy?as?np from?numpy.linalg?import?* def?main(): ????lst?=?[[1,?3,?5],?[2,?4,?6]] ????print(type(lst)) ????np_lst=np.array(list) ????print(type(np_lst)) ????np_lst=np.array(lst,dtype=np.float)#屬性dtype可指定元素唯一的類型 ????#bool,int,int8,int16,int32,int64,int128,uint8,uint16,uint32,uint64,uint128,float,float16/32/64,complex64/128,str等 ????#?其中uint是不帶符號數,complex是復數 ????print(np_lst.shape)#得(2L,3L),表示2行3列 ????print(np_lst.ndim)#得2,表示維度 ????print(np_lst.dtype)#得float64,因為float默認是64位的 ????print(np_lst.itemsize)#得8,因為float64占8個字節 ????print(np_lst.size)#得6,因為一共有6個元素 ?#2?numpy常用Array ????print(np.zeros([2,?4]))#得2行4列的元素都是0的矩陣,常用作初始化 ????print(np.ones([3,?5]))#得3行5列的元素都是1的矩陣 ????print("Rand:") ????print(np.random.rand(2,4))#得2行4列隨機數矩陣,這里的隨機數都是均勻分布的,0~1之間的 ????print(np.random.rand())#得一個隨機數 ????print("RandInt:")#得一個隨機的整數, ????print(np.random.randint(1,10,3))#參數不能為空,齊總1,10表范圍?第三個參數表示個數 ????print("Randn:")#得一個標準正態分布的隨機數 ????print(np.random.randn(2,4))#得一個2行4列的正態分布的隨機數矩陣 ????print("Choice:")#得一個在可選范圍內的隨機 ????print(np.random.choice([10,20,30]))#在10,20,30這三個數中隨機選擇一個數 ????print("Distribute:")#可以得各種分布的數,比如下面 ????print(np.random.beta(1,10,100))#得alpha=1,beta=10的Beta分布的0到1之間的數字100個 #3?numpy常用操作 ????print(np.arange(1,11).reshape([2,-1]))#得1到11(含1不含11)的等差數列,reshape為2行5列(其中5可缺省為-1) ????lst=np.arange(1,11).reshape([2,-1]) ????print("Exp:") ????print(np.exp(lst))#得e指數操作的結果,lst每個元素為冪指數 ????print("Exp2:") ????print(np.exp2(lst))#得2的指數操作的結果,lst每個元素為冪指數 ????print("Sqrt:") ????print(np.sqrt(lst))#得對lst每個元素進行開平方的結果 ????print("Sin:") ????print(np.sin(lst))#得對lst每個元素進行三角函數的結果 ????print("Log:") ????print(np.log(lst))#得對lst每個元素進行對數的結果 ????lst=np.array([[[1,2,3,4], ???????????????????[4,5,6,7]], ??????????????????[[7,8,9,10], ???????????????????[10,11,12,13]], ??????????????????[[14,15,16,17], ???????????????????[18,19,20,21]]]) ????print("Sum") ????print(lst.sum(axis=0))#axis與數組維度有關系,不寫axis時候默認不分維度所有元素相加的和 ??????????????????????????#axis=0是只對最外層數組(即分成3個數組的相應元素的算法)進行sun操作,結果為[[22?25?28?31]?[32?35?38?41]]其中1+7+14=22;2+8+15=25 ????print(lst.sum(axis=1))#axis=1是再進一層(即分成兩個數組相應元素的算法),結果為[[?5??7??9?11]?[17?19?21?23]?[32?34?36?38]]?其中1+4=5;2+5=7 ????print(lst.sum(axis=2))#axis=2是再再進一層,結果為[[10?22]?[34?46]?[62?78]]其中1+2+3+4=10;4+5+6+7=22 ????print("Max") ????print(lst.max(axis=1))#axis與數組維度有關系,不寫axis時候默認不分維度所有元素的最大值 ??????????????????????????#axis=0,1,2含義和上面類似 ????print("Min") ????print(lst.min(axis=0)) ????lst1=?np.array([10,20,30,40]) ????lst2=?np.array([4,?3,?2,?1]) ????print("Add") ????print(lst1?+?lst2)#得[14?23?32?41] ????print("Sub") ????print(lst1?-?lst2)??#?得[?6?17?28?39] ????print("Mul") ????print(lst1?*?lst2)??#?得[40?60?60?40] ????print("Div") ????print(lst1?/?lst2)??#?得[??2.5???6.66666667??15.??40.??] ????print("Square") ????print(lst1**2)??#?得[?100??400??900?1600] ????print("Dot")#點乘,即矩陣相乘,a矩陣的第一行元素分別乘以b矩陣的第一列元素?的和為結果的第一行第一列的一個元素 ????print(np.dot(lst1.reshape([2,2]),lst2.reshape([2,2])))??#?得[[?80??50]?[200?130]]即80=10*4+2*2 ????print("Concatenate")#給numpy中的array元素追加 ????print(np.concatenate((lst1,lst2),axis=0))??#?得[10?20?30?40??4??3??2??1] ????print("Vstack")??#?給numpy中的array元素縱向追加 ????print(np.vstack((lst1,lst2)))#得[[10?20?30?40]?[?4??3??2??1]] ????print("Hstack")??#?給numpy中的array元素橫向追加 ????print(np.hstack((lst1,?lst2)))#得[10?20?30?40??4??3??2??1] ????print("Split")??#?給numpy中的array元素分開 ????print(np.split(lst1,2))#分成2份,得[array([10,?20]),?array([30,?40])] ????print("Copy")??#?給numpy中的array進行拷貝 ????print(np.copy(lst1)) #4?numpy矩陣操作與線性方程組liner ????print("Eye")#線性代數中的單位矩陣 ????print(np.eye(3))#得[[?1.??0.??0.][?0.??1.??0.][?0.??0.??1.]] ????lst=np.array([[1,2],[3,4]]) ????print("Inv:")#矩陣的逆,AB=BA=E?,則我們稱B是A的逆矩陣 ????print(inv(lst))#得[[-2.???1.?]??[?1.5?-0.5]] ????print("T:")??#?轉置矩陣,將矩陣的行列互換得到的新矩陣稱為轉置矩陣 ????print(lst.transpose())??#?得[[1?3]?[2?4]] ????print("Det:")??#求行列式,定義域為det的矩陣A,取值為一個標量,寫作det(A)或?|?A?| ????print(det(lst))??#?得-2.0=1*4-2*3(僅對應二階) ????print("Eig")??#?特征值(第一個array)和特征向量(第二個array) ????print(eig(lst))??#?得(array([-0.37228132,??5.37228132]),?array([[-0.82456484,?-0.41597356],[?0.56576746,?-0.90937671]])) ????y=np.array([[5.],[7.]]) ????print("Solve")#可以用numpy直接解方程組x+2y=5;3x+4y=7 ????print(solve(lst,y))#得[[-3.]?[?4.]] #5?numpy其它應用簡介 ????print("FFT:")??#?快速傅里葉變換?(fast?Fourier?transform),信號處理領域常用到的一個概念 ????print(np.fft.fft(np.array([1,1,1,1,1,1,1,1])))??#?得[?8.+0.j??0.+0.j??0.+0.j??0.+0.j??0.+0.j??0.+0.j??0.+0.j??0.+0.j] ????print("Coef:")??#?皮爾遜相關系數(?Pearson?correlation?coefficient)是數據領域中常用到的系數 ????????????????????#?在統計學中,用于度量兩個變量X和Y之間的相關(線性相關),其值介于-1與1之間。 ????print(np.corrcoef([1,0,1],[0,2,1]))#得[[?1.??-0.8660254]?[-0.8660254??1.]] ????print("Poly:")#生成一元多次函數 ????print(np.poly1d([2,1,3]))#得2?x的2次?+?1?x?+?3 ????#登陸官網查更加細致的api if?__name__=='__main__': ????main()
查看全部 -
#encoding=utf-8 ''' scipy函數庫是numpy基礎上增加了眾多數學、科學以及工程計算常用的庫函數 例如線性代數、常微分方程、信號處理、圖像處理,稀疏矩陣等 關鍵字:數據計算庫 官網:https://www.scipy.org/ ''' import?numpy?as?np from?pylab?import?*#引入一個繪圖模塊,是matplotlib的常用函數 def?main(): #1-?scipy積分?Integral ????from?scipy.integrate?import?quad,dblquad,nquad ????#quad是積分模塊,nquad表示n維積分 ????#在數學分析中,給定函數的定積分的計算不總是可行的 ????#數值積分是利用黎曼積分等數學定義,用數值逼近的方法近似計算給定的定積分值。 ????print(quad(lambda?x:np.exp(-x),0,np.inf))#用quad定義一個lambda函數,exp指對數,x范圍是從0到無窮大 ????#得(1.0000000000000002,?5.842607038578007e-11)?數值積分是計算出一個值和一個誤差,最終的值在前面結果+—右邊范圍之間 ????print(dblquad(lambda?t,x:np.exp(-x*t)/t**3,0,np.inf,lambda?x:1,lambda?x:np.inf)) ????#先定義t的取值范圍可以用常數表示,再定義x的取值范圍因為x相當于是t的函數,所以用函數定義 ????#得結果(0.3333333333366853,?1.3888461883425516e-08) ????def?f(x,y):#定義一個函數 ????????return?x*y ????def?bound_y():#定義y的取值范圍 ????????return?[0,0.5] ????def?bound_x(y):#定義x的邊界,由y得到的范圍 ????????return?[0,1-2*y] ????print(nquad(f,[bound_x,bound_y]))#得值得取值范圍(0.010416666666666668,?4.101620128472366e-16) #scipy優化器Optimizer ????from?scipy.optimize?import?minimize#引入一個計算最小值的模塊 ????def?rosen(x): ????????return?sum(100.0*(x[1:]-x[:-1]**2.0)**2.0+(1-x[:-1])**2.0) ????x0=np.array([1.3,0.7,0.8,1.9,1.2])??#想用optimizer算法的話需要 ????res=minimize(rosen,x0,method="nelder-mead",options={"xtol":1e-8,"disp":True}) ????#計算rosen的最小值,method使用的nelder-mead算法,以動5個點為基礎,不斷地去掉得到最高的點,然后優化成最小值 ????#xtol表示精度,disp:True表示顯示中間過程 ????print("ROSE?MINI:",res)#打印出結果和中間過程 ????print("ROSE?MINI:",res.x)#打印出屬性 ????#求在約束條件下目標函數的最小值 ????def?func(x):#這里x可以是任何參數 ????????return?-(2*x[0]*x[1]+2*x[0]-x[0]**2-2*x[1]**2) ????def?func_deriv(x):#表示定義的原函數即目標函數相對于x和相對于y的顛倒數 ????????dfdx0=-(-2*x[0]+2*x[1]+2)#相對于x的倒數 ????????dfdx1=-(2*x[0]-4*x[1])#相對于y的倒數 ????????return?np.array([dfdx0,dfdx1]) ????#下面定義一個約束條件,分別是相等于0,jac表示求偏導,直接給出偏導式而不是計算機計算可以提高計算速度 ????cons=({"type":"eq","fun":lambda?x:np.array([x[0]**3-x[1]]),"jac":lambda?x:np.array([3.0*(x[0]**2.0),-1.0])}, ?????????{'type':'ineq','fun':lambda?x:np.array([x[1]-1]),'jac':lambda?x:np.array([0.0,1.0])}) ????res=minimize(func,[-1.0,1.0],jac=func_deriv,constraints=cons,method='SLSQP',options={'disp':True}) ????#目標函數func,取值范圍-1到1,jac表示雅克比行列式,constraints表示約束條件,method表示方法,disp:True表示顯示中間過程 ????print("RESTRICT:",res)#在x:?array([?1.00000009,??1.])的時候取到最小值 ????#還可以用優化器求根 ????from?scipy.optimize?import?root ????def?fun(x): ????????return?x+2*np.cos(x) ????sol=root(fun,0.1)#指定初值0.1,求根 ????print("ROOT:",sol.x,sol.fun)#得結果x:array([?1.00000009,1.?])???ROOT:?[-1.02986653]?[?0.] ???? #scipy插值Interpolation ????x=np.linspace(0,1,10)#定義10個數 ????y=np.sin(2*np.pi*x) ????from?scipy.interpolate?import?interp1d#引入插值算法,以一維插值為例 ????li=interp1d(x,y,kind="cubic")#如果不寫任何函數則以線性函數插值,kind=cubic表示三次函數插值 ????x_new=np.linspace(0,1,50)#定義50個數 ????y_new=li(x_new)#l插值算法返回的是函數,輸入自變量可得算法的值 ????figure()#畫出來 ????plot(x,y,"r")#用紅色表示原數據,因為只有十個數顯得比較折線 ????plot(x_new,y_new,"k")#用黑色表示新的數據,因為插入新的數,所以線平滑了很多 ????show() ????print(y_new) #scipy線性計算與矩陣分解?Linear ????from?scipy?import?linalg?as?lg ????arr=np.array([[1,2],[3,4]]) ????print("Det:",lg.det(arr))#計算行列式,得-2.0 ????print("Inv:",lg.inv(arr))#計算冪矩陣,得Inv:?[[-2.???1.?]?[?1.5?-0.5]] ????b=np.array([6,14]) ????print("Sol:",lg.solve(arr,b))#用scipy解線性方程組的,左邊是未知數的因子,右邊是相等的值,得?[?2.??2.] ????print("Eig:",lg.eig(arr))#計算特征值,得(array([-0.37228132+0.j,??5.37228132+0.j]),?array([[-0.82456484,?-0.41597356],?[?0.56576746,?-0.90937671]])) ????print("LU:",lg.lu(arr))#用scipy進行矩陣分解,得(array([[?0.,??1.],???????[?1.,??0.]]),?array([[?1.????????,??0.????????],[?0.33333333,??1.????????]]),?array([[?3.????????,??4.????????],???????[?0.????????,??0.66666667]])) ????print("QR:",lg.qr(arr))#QR分解,得(array([[-0.31622777,?-0.9486833?],?[-0.9486833?,??0.31622777]]),?array([[-3.16227766,?-4.42718872],[?0.????????,?-0.63245553]])) ????print("SVD:",lg.svd(arr))#奇異值分解,得(array([[-0.40455358,?-0.9145143?],[-0.9145143?,??0.40455358]]),?array([?5.4649857?,??0.36596619]),?array([[-0.57604844,?-0.81741556],[?0.81741556,?-0.57604844]])) ????print("Schur:",?lg.schur(arr))#Schur分解,得(array([[-0.37228132,?-1.??],?[?0.????????,??5.37228132]]),?array([[-0.82456484,?-0.56576746],???????[?0.56576746,?-0.82456484]])) #scipy的學習方法 ????''' ????官網:https://www.scipy.org/--->Documentation--->Scipy的 ????Tutorial里面有一些單元 ????比如基本的函數,特殊的函數,積分,優化器,插值,fft,信號處理包括濾波器的設計,線性矩陣,稀疏矩陣稀疏圖,空間坐標器,統計功能,圖形處理功能,子文件處理功能 ????Api接口 ???? ???? ????''' if?__name__=='__main__': ????main()
查看全部 -
python數據分析:
? ? ? ? ? ? ? numpy:數據結構基礎
? ? ????????? scipy:強大的科學計算方法(矩陣分析,信號分析,數理分析....)
? ? ? ? ? ? ? matplotlib:豐富的可視化套件
????????????? pandas:基礎數據分析套件
????????????? scikit-learn:強大的數據分析建模庫
????????????? keras:人工神經網絡
查看全部 -
#encoding=utf-8 ''' matplotlib就是一個繪圖庫 官網:http://matplotlib.org/ ''' import?numpy?as?np import?matplotlib.pyplot?as?plt?#用此來繪制一條線 def?main(): ????''' #?1?基本線圖繪制line ????x?=?np.linspace(-np.pi,?np.pi,?256,?endpoint=True)#定義一個橫軸,類似matlab ????????????????????#定義在-pi到pi之間有256個點,endpoint定義是否包含最后一個點 ????c,s=np.cos(x),np.sin(x)#定義一個余弦函數c,定義一個正弦函數s ????plt.figure(1)#指定第一個圖 ????#?plt.plot(x,c)#進行繪圖,定義自變量x,因變量c ????#?plt.plot(x,s)#進行繪圖,定義自變量x,因變量c ????#?plt.show()#可以顯示簡單的余弦函數和正弦函數 ????plt.plot(x,c,color="blue",linewidth=1.0,line,label="COS",alpha=0.5)#加其他屬性,修改線型 ????#color指定顏色blue,linewidth指定線寬為1.0,linestyle指定線型是直線,加一個label,alpha指定透明度 ????plt.plot(x,s,"r*",label="SIN") ????#用另一種方式指定線型屬性,r表示紅色,*表示線型是星,再加個label ????plt.title("COS?&?SIN")??#?加一些東西,定義一個標題 ????#此時界面上除了正弦反弦函數還有四條直線 ????#如果想加橫軸縱軸,先把兩條線隱藏另外兩條線放到中間即可 ????ax=plt.gca()#gca()就是軸的編輯器 ????ax.spines["right"].set_color("none")#spines就是四條直線 ????ax.spines["top"].set_color("none")#“none”表示隱藏 ????ax.spines["left"].set_position(("data",0))#放到數據域的0位置 ????ax.spines["bottom"].set_position(("data",0)) ????ax.xaxis.set_ticks_position("bottom")#指定xaxis的位置,在橫軸的下面 ????ax.yaxis.set_ticks_position("left")#指定yaxia的位置,在縱軸的左邊 ????plt.xticks([-np.pi,?-np.pi?/?2,?0,?np.pi?/?2,?np.pi],?[r'$-\pi$',?r'$-\pi/2$',?r'$0$',?r'$+\pi/2$',?r'$+\pi$']) ????#設置橫軸,需要兩個數組,第一個數組指定橫軸需要標識的位置,第二個數組指定橫軸標識的內容(寫成pi字符) ????plt.yticks(np.linspace(-1,?1,?5,?endpoint=True))#直接給y軸標數字 ????#下面可以設置橫縱軸標識符的大小 ????for?label?in?ax.get_xticklabels()+ax.get_yticklabels():#得到所有橫軸和縱軸的坐標標識 ????????label.set_fontsize(16)#設置標識符字大小 ????????label.set_bbox(dict(facecolor="white",edgecolor="None",alpha=0.2))#設置label小方塊格式,也橫縱坐標標識符小方塊格式 ????????????????????#facecolor是背景顏色,edgecolor是邊緣顏色,alpha透明度 ????plt.legend(loc="upper?left")#指定legend位置,也就是圖例偏上偏左 ????plt.grid()#打印出網格線 ????#?plt.axis([-1,1,-0.5,1])?#指定顯示范圍 ????#前面兩個指定橫軸最小最大,后面兩個指定縱軸最小最大 ????#接下來是一些有意思的功能 ????plt.fill_between(x,np.abs(x)<0.5,c,c>0.5,color="green",alpha=0.25)#填充功能 ????#x表示橫軸,第二個是判斷型元素,真返回1,假返回0;c表示縱軸 ????t=1#在t=1的地方進行注釋,加條線 ????plt.plot([t,t],[0,np.cos(t)],"y",linewidth=3,line) ????#“y”表示黃色,線型寬3,“--”表示虛線 ????#下面給這條線加個注釋 ????plt.annotate("cos(1)",#畫的是cos(1) ?????????????????xy=(t,np.cos(1)),#加的點的位置 ?????????????????xycoords="data",#以被注釋的坐標點xy為參考?(默認值) ?????????????????xytext=(+10,+30),#如果不指定,注釋會加到點上被覆蓋住,所以有個偏移量 ?????????????????textcoords="offset?points",#給偏移量指定是相對位置 ?????????????????arrowprops=dict(arrow,connection))#指定箭頭類型 ?????????????????????????????????????????????????#這里設置箭頭的屬性,弧度為0.2 ????plt.show() ????''' #子圖與多種圖形繪制 #scatter散點圖 ????fig=plt.figure() ????ax=fig.add_subplot(3,3,1)#圖畫在了三行三列第一個位置上 ????n=128 ????X=np.random.normal(0,1,n)#生成隨機數 ????Y=np.random.normal(0,1,n) ????T=np.arctan2(Y,X)#T主要是用來上色 ????#plt.axes([0.025,0.025,0.95,0.95])#如果沒指定ax的顯示指定范圍 ????ax.scatter(X,Y,s=75,c=T,alpha=.5)#用來畫三點,s表示點的大小,c表示color,alpha表示透明度 ????plt.xlim(-1.5,1.5),plt.xticks([])#x的范圍,這里xticks設為空 ????plt.xlim(-1.5,1.5),plt.yticks([]) ????plt.axis() ????plt.title("scatter") ????plt.xlabel("x") ????plt.ylabel("y") ????#plt.show() #bar條狀圖 ????fig.add_subplot(332)#也可以這么表示三行三列第二個圖,但如果分10個以上則不能這么寫 ????#只要加了add_subplot,接下來plt畫圖會在子圖上,不賦值也可 ????n=10#定義十個點 ????X=np.arange(n) ????Y1?=?(1?-?X?/?float(n))?*?np.random.uniform(0.5,?1.0,?n)#隨機數范圍在0.5~1之間 ????Y2?=?(1?-?X?/?float(n))?*?np.random.uniform(0.5,?1.0,?n) ????plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white')#正的Y1放在上面 ????plt.bar(X,?-Y2,?facecolor='#ff9999',?edgecolor='white')#負的Y2放在下面 ????for?x,y?in?zip(X,Y1):#給Y1添加注釋,ha表示水平位置,va表示垂直位置 ????????plt.text(x+0.4,y+0.05,'%.2f'%y,ha='center',va='bottom') ????for?x,?y?in?zip(X,?Y2):#給Y2添加注釋 ????????plt.text(x?+?0.4,?-?y?-?0.05,?'%.2f'?%?y,?ha='center',?va='top') #Pie?餅圖 ????fig.add_subplot(333) ????n=20#20個不分 ????Z=np.ones(n)#全1的部分 ????Z[-1]*=2#最后一個設置成2 ????plt.pie(Z,#數組傳進去代表每一塊的值 ????????????explode=Z*.05,#每一個扇形與中心的距離 ????????????colors=['%f'%(i/float(n))?for?i?in?range(n)],#每一個都有不同的顏色,%f表示灰度顏色,這里是不同的灰度,也可用不同RGB色 ????????????labels=['%.2f'%(i/float(n))?for?i?in?range(n)])#每一個顏色的值打印出來 ????plt.gca().set_aspect('equal')#成為一個正的圓,不然會根據跨度發生形變 ????plt.xticks([]),plt.yticks([]) #polar極坐標的圖 ????fig.add_subplot(334,polar=True)#加上polar屬性就是極值圖,不然就是普通折線圖 ????n=20 ????theta=np.arange(0.0,2*np.pi,2*np.pi/n) ????radii=10*np.random.rand(n) ????plt.polar(theta,radii) ????#plt.plot(theta,radii)#polt表示畫折線 #heatmap熱圖 ????fig.add_subplot(335) ????from?matplotlib?import?cm ????data=np.random.rand(3,3)#定義3*3的隨機數 ????cmap=cm.Blues#藍色系 ????map=plt.imshow(data, ???????????????????interpolation='nearest',#用離最近的差值方法 ???????????????????cmap=cmap, ???????????????????aspect='auto',#指定縮放是auto ???????????????????vmin=0,#指定cmap里最小值是0,白色 ???????????????????vmax=1)#最大值是指定的顏色Blue #3D圖 ????from?mpl_toolkits.mplot3d?import?Axes3D ????ax=fig.add_subplot(336,projection="3d")#需要指定projection是3d ????ax.scatter(1,1,3,s=100)#s表示尺寸,這里scatter也可以用plot之類的代替 #hot?map?熱力圖 ????fig.add_subplot(313)#3列一行第三個,指的橫跨第三行 ????def?f(x,y): ????????return?(1-x/2+x**5+y**3)*np.exp(-x**2-y**2) ????n=256 ????x=np.linspace(-3,3,n) ????y=np.linspace(-3,3,n) ????X,Y=np.meshgrid(x,y) ????plt.contourf(X,Y,f(X,Y),8,alpha=.75,cmap=plt.cm.hot)#熱力圖用contour,顏色用cmap指定 #保存圖片 ????plt.savefig("./data/fig.png") ????plt.show()#半截show()了,就不會追加到同一個圖里了 if?__name__=='__main__': ????main()
查看全部
舉報