1. numpy科學計算基礎庫
1.1 numpy讀取資料
CSV:Comma-Separated Value,逗號分隔值檔案
顯示:表格狀態
源檔案:換行和逗號分隔行列的格式化文本,每一行的資料表示一條記錄,
由于csv便于展示,讀取和寫入,所以很多地方也是用csv的格式存盤和傳輸中小型的資料,為了方便教學,我們會經常操作csv格式的檔案,但是操作資料庫中的資料也是很容易的實作的,
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

np.loadtxt(US_video_data_ numbers_path,delimiter=\",\",dtype=int,unpack=1)
注意其中添加delimiter和dtype以及unpack的效果
delimiter:指定邊界符號是什么,不指定會導致每行資料為一個整體的字串而報錯
dtype:默認情況下對于較大的資料會將其變為科學計數的方式
那么unpack的效果呢?
upack:默認是Flase(0),默認情況下,有多少條資料,就會有多少行
為True(1)的情況下,每一列的資料會組成一行,原始資料有多少列,加載出來的資料就會有多少行,相當于轉置的效果
1.2 numpy中的轉置
轉置是一種變換,對于numpy中的陣列來說,就是在對角線方向交換資料,目的也是為了更方便的去處理資料,
# coding=utf-8 import numpy as np t = np.array([[0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,1,15,16,17]]) print(t) print(t.swapaxes(1,0)) print(t.transpose()) print(t.T)
運行結果:

1.3 numpy索引和切片
對于剛剛加載出來的資料,我如果只想選擇其中的某一列(行)我們應該怎么做呢?
# coding=utf-8 import numpy as np a = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]]) #取一行 print(a[1]) #取多行 print(a[1:3]) #取一列 print(a[:,2]) #取多列 print(a[:,2:4])
運行結果:

1.4 numpy中數值的修改
# coding=utf-8 import numpy as np t = np.array([[0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,14,15,16,17],[18,19,20,21,22,23]]) print(t) print(t[:,2:4]) t[:,2:4] = 0 print(t)
運行結果:

1.5 numpy中布爾索引
# coding=utf-8 import numpy as np t = np.arange(24).reshape((4,6)) print(t) print(t<10) t[t<10] = 0 print(t)
運行結果:

1.6 numpy中三元運算子
# coding=utf-8 import numpy as np t = np.arange(24).reshape((4,6)) print(t) print(np.where(t<10,0,10))
運行結果:

1.7 numpy中的nan和inf
nan(NAN,Nan):not a number表示不是一個數字
什么時候numpy中會出現nan:
當我們讀取本地的檔案為float的時候,如果有缺失,就會出現nan
當做了一個不合適的計算的時候(比如無窮大(inf)減去無窮大)
inf(-inf,inf):infinity,inf表示正無窮,-inf表示負無窮
什么時候回出現inf包括(-inf,+inf)
比如一個數字除以0,(python中直接會報錯,numpy中是一個inf或者-inf)
# coding=utf-8 import numpy as np #兩個nan是不相等的 print(np.nan == np.nan) print(np.nan != np.nan) #以上的特性,判斷陣列中nan的個數 t = np.array([1.,2.,np.nan]) print(np.count_nonzero(t!=t)) #由于np.nan != np.nan為True,那么如何判斷一個數字是否為nan呢? #通過np.isnan(a)來判斷,回傳bool型別,比如希望把nan替換為0 t[np.isnan(t)]=0 print(t) #nan和任何值計算都為nan
運行結果:

# coding=utf-8 import numpy as np def fill_ndarray(t1): for i in range(t1.shape[1]): # 遍歷每一列 temp_col = t1[:, i] # 當前的一列 nan_num = np.count_nonzero(temp_col != temp_col) if nan_num != 0: # 不為0,說明當前這一列中有nan temp_not_nan_col = temp_col[temp_col == temp_col] # 當前一列不為nan的array # 選中當前為nan的位置,把值賦值為不為nan的均值 temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() return t1 if __name__ == '__main__': t1 = np.arange(24).reshape((4, 6)).astype("float") t1[1, 2:] = np.nan print(t1) t1 = fill_ndarray(t1) print(t1)
運行結果:

1.8 numpy中常用統計函式
求和:t.sum(axis=None)
均值:t.mean(a,axis=None) 受離群點的影響較大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
極值:np.ptp(t,axis=None) 即最大值和最小值只差
標準差:t.std(axis=None)
標準差是一組資料平均值分散程度的一種度量,一個較大的標準差,代表大部分數值和其平均值之間差異較大;一個較小的標準差,代表這些數值較接近平均值
反映出資料的波動穩定情況,越大表示波動越大,約不穩定,
缺失值填充均值:
# coding=utf-8 import numpy as np def fill_ndarray(t1): for i in range(t1.shape[1]): #遍歷每一列 temp_col = t1[:,i] #當前的一列 nan_num = np.count_nonzero(temp_col!=temp_col) if nan_num !=0: #不為0,說明當前這一列中有nan temp_not_nan_col = temp_col[temp_col==temp_col] #當前一列不為nan的array # 選中當前為nan的位置,把值賦值為不為nan的均值 temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean() return t1 if __name__ == '__main__': t1 = np.arange(24).reshape((4, 6)).astype("float") t1[1, 2:] = np.nan print(t1) t1 = fill_ndarray(t1) print(t1)
運行結果:

1.9 numpy生成亂數

1.10 實體運用
假設我們現在有一個英國和美國各自youtube1000多個視頻的點擊,喜歡,不喜歡,評論數量(["views","likes","dislikes","comment_total"])的csv,運用剛剛所學習的只是,我們嘗試來對其進行操作,
準備資料:youtube_video_data.rar
案例1:
import numpy as np from matplotlib import pyplot as plt us_file_path = "./US_video_data_numbers.csv" uk_file_path = "./GB_video_data_numbers.csv" # t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True) t_us = np.loadtxt(us_file_path,delimiter=",",dtype="int") #取評論的資料 t_us_comments = t_us[:,-1] #選擇比5000小的資料 t_us_comments = t_us_comments[t_us_comments<=5000] print(t_us_comments.max(),t_us_comments.min()) d = 50 bin_nums = (t_us_comments.max()-t_us_comments.min())//d #繪圖 plt.figure(figsize=(20,8),dpi=80) plt.hist(t_us_comments,bin_nums) plt.show()
運行結果:

案例2:
import numpy as np from matplotlib import pyplot as plt us_file_path = "./US_video_data_numbers.csv" uk_file_path = "./GB_video_data_numbers.csv" # t1 = np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True) t_uk = np.loadtxt(uk_file_path,delimiter=",",dtype="int") #選擇喜歡書比50萬小的資料 t_uk = t_uk[t_uk[:,1]<=500000] t_uk_comment = t_uk[:,-1] t_uk_like = t_uk[:,1] plt.figure(figsize=(20,8),dpi=80) plt.scatter(t_uk_like,t_uk_comment) plt.show()
運行結果:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/161035.html
標籤:Python
下一篇:機器學習之集成學習
