机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)
??? Numpy(Numerical Python)
Numpy:提供了一個在Python中做科學計算的基礎庫,重在數值計算,主要用于多維數組(矩陣)處理的庫。用來存儲和處理大型矩陣,比Python自身的嵌套列表結構要高效的多。本身是由C語言開發,是個很基礎的擴展,Python其余的科學計算擴展大部分都是以此為基礎。
??? 高性能科學計算和數據分析的基礎包
??? ndarray,多維數組(矩陣),具有矢量運算能力,快速、節省空間
??? 矩陣運算,無需循環,可完成類似Matlab中的矢量運算
??? 線性代數、隨機數生成
??? import numpy as np
?
ndarray 多維數組(N Dimension Array)
NumPy數組是一個多維的數組對象(矩陣),稱為ndarray,具有矢量算術運算能力和復雜的廣播能力,并具有執行速度快和節省空間的特點。
注意:ndarray的下標從0開始,且數組里的所有元素必須是相同類型
ndarray擁有的屬性
??? ndim屬性:維度個數
??? shape屬性:維度大小
??? dtype屬性:數據類型
??? ndarray的隨機創建
??? 通過隨機抽樣 (numpy.random) 生成隨機數據。
示例代碼:
??? # 導入numpy,別名np
??? import numpy as np
??? ?
??? # 生成指定維度大小(3行4列)的隨機多維浮點型數據(二維),rand固定區間0.0 ~ 1.0
??? arr = np.random.rand(3, 4)
??? print(arr)
??? print(type(arr))
??? ?
??? # 生成指定維度大小(3行4列)的隨機多維整型數據(二維),randint()可以指定區間(-1, 5)
??? arr = np.random.randint(-1, 5, size = (3, 4)) # 'size='可省略
??? print(arr)
??? print(type(arr))
??? ?
??? # 生成指定維度大小(3行4列)的隨機多維浮點型數據(二維),uniform()可以指定區間(-1, 5)
??? arr = np.random.uniform(-1, 5, size = (3, 4)) # 'size='可省略
??? print(arr)
??? print(type(arr))
??? ?
??? print('維度個數: ', arr.ndim)
??? print('維度大小: ', arr.shape)
??? print('數據類型: ', arr.dtype)
運行結果:
??? [[ 0.09371338? 0.06273976? 0.22748452? 0.49557778]
???? [ 0.30840042? 0.35659161? 0.54995724? 0.018144? ]
???? [ 0.94551493? 0.70916088? 0.58877255? 0.90435672]]
??? <class 'numpy.ndarray'>
??? ?
??? [[ 1? 3? 0? 1]
???? [ 1? 4? 4? 3]
???? [ 2? 0 -1 -1]]
??? <class 'numpy.ndarray'>
??? ?
??? [[ 2.25275308? 1.67484038 -0.03161878 -0.44635706]
???? [ 1.35459097? 1.66294159? 2.47419548 -0.51144655]
???? [ 1.43987571? 4.71505054? 4.33634358? 2.48202309]]
??? <class 'numpy.ndarray'>
??? ?
??? 維度個數:? 2
??? 維度大小:? (3, 4)
??? 數據類型:? float64
??? ndarray的序列創建
1. np.array(collection)
??? collection 為 序列型對象(list)、嵌套序列對象(list of list)。
示例代碼:
??? # list序列轉換為 ndarray
??? lis = range(10)
??? arr = np.array(lis)
??? ?
??? print(arr)??????????? # ndarray數據
??? print(arr.ndim)??????? # 維度個數
??? print(arr.shape)??? # 維度大小
??? ?
??? # list of list嵌套序列轉換為ndarray
??? lis_lis = [range(10), range(10)]
??? arr = np.array(lis_lis)
??? ?
??? print(arr)??????????? # ndarray數據
??? print(arr.ndim)??????? # 維度個數
??? print(arr.shape)??? # 維度大小
運行結果:
??? # list序列轉換為 ndarray
??? [0 1 2 3 4 5 6 7 8 9]
??? 1
??? (10,)
??? ?
??? # list of list嵌套序列轉換為 ndarray
??? [[0 1 2 3 4 5 6 7 8 9]
???? [0 1 2 3 4 5 6 7 8 9]]
??? 2
??? (2, 10)
2. np.zeros()
??? 指定大小的全0數組。注意:第一個參數是元組,用來指定大小,如(3, 4)。
3. np.ones()
??? 指定大小的全1數組。注意:第一個參數是元組,用來指定大小,如(3, 4)。
4. np.empty()
??? 初始化數組,不是總是返回全0,有時返回的是未初始的隨機值(內存里的隨機值)。
示例代碼(2、3、4):
??? # np.zeros
??? zeros_arr = np.zeros((3, 4))
??? ?
??? # np.ones
??? ones_arr = np.ones((2, 3))
??? ?
??? # np.empty
??? empty_arr = np.empty((3, 3))
??? ?
??? # np.empty 指定數據類型
??? empty_int_arr = np.empty((3, 3), int)
??? ?
??? print('------zeros_arr-------')
??? print(zeros_arr)
??? ?
??? print('\n------ones_arr-------')
??? print(ones_arr)
??? ?
??? print('\n------empty_arr-------')
??? print(empty_arr)
??? ?
??? print('\n------empty_int_arr-------')
??? print(empty_int_arr)
運行結果:
??? ------zeros_arr-------
??? [[ 0.? 0.? 0.? 0.]
???? [ 0.? 0.? 0.? 0.]
???? [ 0.? 0.? 0.? 0.]]
??? ?
??? ------ones_arr-------
??? [[ 1.? 1.? 1.]
???? [ 1.? 1.? 1.]]
??? ?
??? ------empty_arr-------
??? [[ 0.? 0.? 0.]
???? [ 0.? 0.? 0.]
???? [ 0.? 0.? 0.]]
??? ?
??? ------empty_int_arr-------
??? [[0 0 0]
???? [0 0 0]
???? [0 0 0]]
5. np.arange() 和 reshape()
??? arange() 類似 python 的 range() ,創建一個一維 ndarray 數組。
??? reshape() 將 重新調整數組的維數。
示例代碼(5):
??? # np.arange()
??? arr = np.arange(15) # 15個元素的 一維數組
??? print(arr)
??? print(arr.reshape(3, 5)) # 3x5個元素的 二維數組
??? print(arr.reshape(1, 3, 5)) # 1x3x5個元素的 三維數組
運行結果:
??? [ 0? 1? 2? 3? 4? 5? 6? 7? 8? 9 10 11 12 13 14]
??? ?
??? [[ 0? 1? 2? 3? 4]
???? [ 5? 6? 7? 8? 9]
???? [10 11 12 13 14]]
??? ?
??? [[[ 0? 1? 2? 3? 4]
????? [ 5? 6? 7? 8? 9]
????? [10 11 12 13 14]]]
6. np.arange() 和 random.shuffle()
??? random.shuffle() 將打亂數組序列(類似于洗牌)。
示例代碼(6):
??? arr = np.arange(15)
??? print(arr)
??? ?
??? np.random.shuffle(arr)
??? print(arr)
??? print(arr.reshape(3,5))
運行結果:
??? [ 0? 1? 2? 3? 4? 5? 6? 7? 8? 9 10 11 12 13 14]
??? ?
??? [ 5? 8? 1? 7? 4? 0 12? 9 11? 2 13 14 10? 3? 6]
??? ?
??? [[ 5? 8? 1? 7? 4]
???? [ 0 12? 9 11? 2]
???? [13 14 10? 3? 6]]
??? ndarray的數據類型
1. dtype參數
??? 指定數組的數據類型,類型名+位數,如float64, int32
2. astype方法
??? 轉換數組的數據類型
示例代碼(1、2):
??? # 初始化3行4列數組,數據類型為float64
??? zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
??? print(zeros_float_arr)
??? print(zeros_float_arr.dtype)
??? ?
??? # astype轉換數據類型,將已有的數組的數據類型轉換為int32
??? zeros_int_arr = zeros_float_arr.astype(np.int32)
??? print(zeros_int_arr)
??? print(zeros_int_arr.dtype)
運行結果:
??? [[ 0.? 0.? 0.? 0.]
???? [ 0.? 0.? 0.? 0.]
???? [ 0.? 0.? 0.? 0.]]
??? float64
??? ?
??? [[0 0 0 0]
???? [0 0 0 0]
???? [0 0 0 0]]
??? int32
??? ndarray的矩陣運算
??? 數組是編程中的概念,矩陣、矢量是數學概念。
??? 在計算機編程中,矩陣可以用數組形式定義,矢量可以用結構定義!
1. 矢量運算:相同大小的數組間運算應用在元素上
示例代碼(1):
??? # 矢量與矢量運算
??? arr = np.array([[1, 2, 3],
??????????????????? [4, 5, 6]])
??? ?
??? print("元素相乘:")
??? print(arr * arr)
??? ?
??? print("矩陣相加:")
??? print(arr + arr)
運行結果:
??? 元素相乘:
??? [[ 1? 4? 9]
???? [16 25 36]]
??? ?
??? 矩陣相加:
??? [[ 2? 4? 6]
???? [ 8 10 12]]
2. 矢量和標量運算:"廣播" - 將標量"廣播"到各個元素
示例代碼(2):
??? # 矢量與標量運算
??? print(1. / arr)
??? print(2. * arr)
運行結果:
??? [[ 1.????????? 0.5???????? 0.33333333]
???? [ 0.25??????? 0.2???????? 0.16666667]]
??? ?
??? [[? 2.?? 4.?? 6.]
???? [? 8.? 10.? 12.]]
??? ndarray的索引與切片
1. 一維數組的索引與切片
??? 與Python的列表索引功能相似
示例代碼(1):
??? # 一維數組
??? arr1 = np.arange(10)
??? print(arr1)
??? print(arr1[2:5])
運行結果:
??? [0 1 2 3 4 5 6 7 8 9]
??? [2 3 4]
2. 多維數組的索引與切片:
??? arr[r1:r2, c1:c2]
??? arr[1,1] 等價 arr[1][1]
??? [:] 代表某個維度的數據
示例代碼(2):
??? # 多維數組
??? arr2 = np.arange(12).reshape(3,4)
??? print(arr2)
??? ?
??? print(arr2[1])
??? ?
??? print(arr2[0:2, 2:])
??? ?
??? print(arr2[:, 1:3])
運行結果:
??? [[ 0? 1? 2? 3]
???? [ 4? 5? 6? 7]
???? [ 8? 9 10 11]]
??? ?
??? [4 5 6 7]
??? ?
??? [[2 3]
???? [6 7]]
??? ?
??? [[ 1? 2]
???? [ 5? 6]
???? [ 9 10]]
3. 條件索引
??? 布爾值多維數組:arr[condition],condition也可以是多個條件組合。
??? 注意,多個條件組合要使用 & | 連接,而不是Python的 and or。
示例代碼(3):
??? # 條件索引
??? ?
??? # 找出 data_arr 中 2005年后的數據
??? data_arr = np.random.rand(3,3)
??? print(data_arr)
??? ?
??? year_arr = np.array([[2000, 2001, 2000],
???????????????????????? [2005, 2002, 2009],
???????????????????????? [2001, 2003, 2010]])
??? ?
??? is_year_after_2005 = year_arr >= 2005
??? print(is_year_after_2005, is_year_after_2005.dtype)
??? ?
??? filtered_arr = data_arr[is_year_after_2005]
??? print(filtered_arr)
??? ?
??? #filtered_arr = data_arr[year_arr >= 2005]
??? #print(filtered_arr)
??? ?
??? # 多個條件
??? filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
??? print(filtered_arr)
運行結果:
??? [[ 0.53514038? 0.93893429? 0.1087513 ]
???? [ 0.32076215? 0.39820313? 0.89765765]
???? [ 0.6572177?? 0.71284822? 0.15108756]]
??? ?
??? [[False False False]
???? [ True False? True]
???? [False False? True]] bool
??? ?
??? [ 0.32076215? 0.89765765? 0.15108756]
??? ?
??? #[ 0.32076215? 0.89765765? 0.15108756]
??? ?
??? [ 0.53514038? 0.1087513?? 0.39820313]
ndarray的維數轉換
??? 二維數組直接使用轉換函數:transpose()
??? 高維數組轉換要指定維度編號參數 (0, 1, 2, …),注意參數是元組
示例代碼:
??? arr = np.random.rand(2,3)??? # 2x3 數組
??? print(arr)?? ?
??? print(arr.transpose()) # 轉換為 3x2 數組
??? ?
??? ?
??? arr3d = np.random.rand(2,3,4) # 2x3x4 數組,2對應0,3對應1,4對應3
??? print(arr3d)
??? print(arr3d.transpose((1,0,2))) # 根據維度編號,轉為為 3x2x4 數組
運行結果:
??? # 二維數組轉換
??? # 轉換前:
??? [[ 0.50020075? 0.88897914? 0.18656499]
???? [ 0.32765696? 0.94564495? 0.16549632]]
??? ?
??? # 轉換后:
??? [[ 0.50020075? 0.32765696]
???? [ 0.88897914? 0.94564495]
???? [ 0.18656499? 0.16549632]]
??? ?
??? ?
??? # 高維數組轉換
??? # 轉換前:
??? [[[ 0.91281153? 0.61213743? 0.16214062? 0.73380458]
????? [ 0.45539155? 0.04232412? 0.82857746? 0.35097793]
????? [ 0.70418988? 0.78075814? 0.70963972? 0.63774692]]
??? ?
???? [[ 0.17772347? 0.64875514? 0.48422954? 0.86919646]
????? [ 0.92771033? 0.51518773? 0.82679073? 0.18469917]
????? [ 0.37260457? 0.49041953? 0.96221477? 0.16300198]]]
??? ?
??? # 轉換后:
??? [[[ 0.91281153? 0.61213743? 0.16214062? 0.73380458]
????? [ 0.17772347? 0.64875514? 0.48422954? 0.86919646]]
??? ?
???? [[ 0.45539155? 0.04232412? 0.82857746? 0.35097793]
????? [ 0.92771033? 0.51518773? 0.82679073? 0.18469917]]
??? ?
???? [[ 0.70418988? 0.78075814? 0.70963972? 0.63774692]
????? [ 0.37260457? 0.49041953? 0.96221477? 0.16300198]]]
??? 元素計算函數
??? ceil(): 向上最接近的整數,參數是 number 或 array
??? floor(): 向下最接近的整數,參數是 number 或 array
??? rint(): 四舍五入,參數是 number 或 array
??? isnan(): 判斷元素是否為 NaN(Not a Number),參數是 number 或 array
??? multiply(): 元素相乘,參數是 number 或 array
??? divide(): 元素相除,參數是 number 或 array
??? abs():元素的絕對值,參數是 number 或 array
??? where(condition, x, y): 三元運算符,x if condition else y
示例代碼(1、2、3、4、5、6、7):
??? # randn() 返回具有標準正態分布的序列。
??? arr = np.random.randn(2,3)
??? ?
??? print(arr)
??? ?
??? print(np.ceil(arr))
??? ?
??? print(np.floor(arr))
??? ?
??? print(np.rint(arr))
??? ?
??? print(np.isnan(arr))
??? ?
??? print(np.multiply(arr, arr))
??? ?
??? print(np.divide(arr, arr))
??? ?
??? print(np.where(arr > 0, 1, -1))
運行結果:
??? # print(arr)
??? [[-0.75803752? 0.0314314?? 1.15323032]
???? [ 1.17567832? 0.43641395? 0.26288021]]
??? ?
??? # print(np.ceil(arr))
??? [[-0.? 1.? 2.]
???? [ 2.? 1.? 1.]]
??? ?
??? # print(np.floor(arr))
??? [[-1.? 0.? 1.]
???? [ 1.? 0.? 0.]]
??? ?
??? # print(np.rint(arr))
??? [[-1.? 0.? 1.]
???? [ 1.? 0.? 0.]]
??? ?
??? # print(np.isnan(arr))
??? [[False False False]
???? [False False False]]
??? ?
??? # print(np.multiply(arr, arr))
??? [[? 5.16284053e+00?? 1.77170104e+00?? 3.04027254e-02]
???? [? 5.11465231e-03?? 3.46109263e+00?? 1.37512421e-02]]
??? ?
??? # print(np.divide(arr, arr))
??? [[ 1.? 1.? 1.]
???? [ 1.? 1.? 1.]]
??? ?
??? # print(np.where(arr > 0, 1, -1))
??? [[ 1? 1 -1]
???? [-1? 1? 1]]
??? 元素統計函數
??? np.mean(), np.sum():所有元素的平均值,所有元素的和,參數是 number 或 array
??? np.max(), np.min():所有元素的最大值,所有元素的最小值,參數是 number 或 array
??? np.std(), np.var():所有元素的標準差,所有元素的方差,參數是 number 或 array
??? np.argmax(), np.argmin():最大值的下標索引值,最小值的下標索引值,參數是 number 或 array
??? np.cumsum(), np.cumprod():返回一個一維數組,每個元素都是之前所有元素的 累加和 和 累乘積,參數是 number 或 array
??? 多維數組默認統計全部維度,axis參數可以按指定軸心統計,值為0則按列統計,值為1則按行統計。
示例代碼:
??? arr = np.arange(12).reshape(3,4)
??? print(arr)
??? ?
??? print(np.cumsum(arr)) # 返回一個一維數組,每個元素都是之前所有元素的 累加和
??? ?
??? print(np.sum(arr)) # 所有元素的和
??? ?
??? print(np.sum(arr, axis=0)) # 數組的按列統計和
??? ?
??? print(np.sum(arr, axis=1)) # 數組的按行統計和
運行結果:
??? # print(arr)
??? [[ 0? 1? 2? 3]
???? [ 4? 5? 6? 7]
???? [ 8? 9 10 11]]
??? ?
??? # print(np.cumsum(arr))
??? [ 0? 1? 3? 6 10 15 21 28 36 45 55 66]
??? ?
??? # print(np.sum(arr)) # 所有元素的和
??? 66
??? ?
??? # print(np.sum(arr, axis=0)) # 0表示對數組的每一列的統計和
??? [12 15 18 21]
??? ?
??? # print(np.sum(arr, axis=1)) # 1表示數組的每一行的統計和
??? [ 6 22 38]
??? 元素判斷函數
??? np.any(): 至少有一個元素滿足指定條件,返回True
??? np.all(): 所有的元素滿足指定條件,返回True
示例代碼:
??? arr = np.random.randn(2,3)
??? print(arr)
??? ?
??? print(np.any(arr > 0))
??? print(np.all(arr > 0))
運行結果:
??? [[ 0.05075769 -1.31919688 -1.80636984]
???? [-1.29317016 -1.3336612? -0.19316432]]
??? ?
??? True
??? False
??? 元素去重排序函數
np.unique():找到唯一值并返回排序結果,類似于Python的set集合
示例代碼:
??? arr = np.array([[1, 2, 1], [2, 3, 4]])
??? print(arr)
??? ?
??? print(np.unique(arr))
運行結果:
??? [[1 2 1]
???? [2 3 4]]
??? ?
??? [1 2 3 4]
2016年美國總統大選民意調查數據統計:
??? 項目地址:https://www.kaggle.com/fivethirtyeight/2016-election-polls
??? 該數據集包含了2015年11月至2016年11月期間對于2016美國大選的選票數據,共27列數據
??? 示例代碼1 :
??? # loadtxt
??? import numpy as np
??? ?
??? # csv 名逗號分隔值文件
??? filename = './presidential_polls.csv'
??? ?
??? # 通過loadtxt()讀取本地csv文件
??? data_array = np.loadtxt(filename,????? # 文件名
??????????????????????????? delimiter=',', # 分隔符
??????????????????????????? dtype=str,???? # 數據類型,數據是Unicode字符串
??????????????????????????? usecols=(0,2,3)) # 指定讀取的列號
??? ?
??? # 打印ndarray數據,保留第一行
??? print(data_array, data_array.shape)
運行結果:
??? [["b'cycle'" "b'type'" "b'matchup'"]
???? ["b'2016'" 'b\'"polls-plus"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
???? ["b'2016'" 'b\'"polls-plus"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
???? ...,
???? ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
???? ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']
???? ["b'2016'" 'b\'"polls-only"\'' 'b\'"Clinton vs. Trump vs. Johnson"\'']] (10237, 3)
??? 示例代碼2:
??? import numpy as np
??? # 讀取列名,即第一行數據
??? with open(filename, 'r') as f:
??????? col_names_str = f.readline()[:-1] # [:-1]表示不讀取末尾的換行符'\n'
??? ?
??? # 將字符串拆分,并組成列表
??? col_name_lst = col_names_str.split(',')
??? ?
??? # 使用的列名:結束時間,克林頓原始票數,川普原始票數,克林頓調整后票數,川普調整后票數
??? use_col_name_lst = ['enddate', 'rawpoll_clinton', 'rawpoll_trump','adjpoll_clinton', 'adjpoll_trump']
??? ?
??? # 獲取相應列名的索引號
??? use_col_index_lst = [col_name_lst.index(use_col_name) for use_col_name in use_col_name_lst]
??? ?
??? # 通過genfromtxt()讀取本地csv文件,
??? data_array = np.genfromtxt(filename,????? # 文件名
??????????????????????????? delimiter=',', # 分隔符
??????????????????????????? #skiprows=1,??? # 跳過第一行,即跳過列名
??????????????????????????? dtype=str,???? # 數據類型,數據不再是Unicode字符串
??????????????????????????? usecols=use_col_index_lst)# 指定讀取的列索引號
??? ?
??? ?
??? # genfromtxt() 不能通過 skiprows 跳過第一行的
??? # ['enddate' 'rawpoll_clinton' 'rawpoll_trump' 'adjpoll_clinton' 'adjpoll_trump']
??? ?
??? # 去掉第一行
??? data_array = data_array[1:]
??? ?
??? # 打印ndarray數據
??? print(data_array[1:], data_array.shape)
運行結果:
??? [['10/30/2016' '45' '46' '43.29659' '44.72984']
???? ['10/30/2016' '48' '42' '46.29779' '40.72604']
???? ['10/24/2016' '48' '45' '46.35931' '45.30585']
???? ...,
???? ['9/22/2016' '46.54' '40.04' '45.9713' '39.97518']
???? ['6/21/2016' '43' '43' '45.2939' '46.66175']
???? ['8/18/2016' '32.54' '43.61' '31.62721' '44.65947']] (10236, 5)
?
Numpy庫常用函數總結
ndarray對象操作
.ndim :秩,即軸的數量或者維度的數量
.shape :ndarray對象的尺度(以元組形式),對于矩陣,n行m列
.size :ndarray對象元素的個數,相當于.shape中n*m的值
.dtype :ndarray對象元素類型 dtype(‘int32’)
.itemsize :ndarray對象每個元素的大小,以字節為單位 ,每個元素占4個字節
數組的維度變換
.reshape(shape) : 不改變當前數組元素,返回一個shape形狀的數組,原數組不變
.resize(shape) : 返回一個shape形狀的數組,但修改當前數組
.swapaxes(ax1, ax2) : 將數組n個維度中兩個維度進行調換
.flatten() : 對數組進行降維,返回折疊后的一維數組,原數組不變
數組的類型變換
.astype(new_type) : eg, a.astype (np.float)數據類型的轉換,會創建新的數組
.tolist() 數組向列表的轉換
數組的索引和切片
一維數組切片
a = np.array ([9, 8, 7, 6, 5, ])
a[1:4:2] –> array([8, 6]) : a[起始編號:終止編號(不含): 步長]
多維數組索引
a = np.arange(24).reshape((2, 3, 4))
a[1, 2, 3] 表示 3個維度上的編號, 各個維度的編號用逗號分隔
多維數組切片
a [:,:,::2 ] 缺省時,表示從第0個元素開始,到最后一個元素
數組的運算
np.abs(a) np.fabs(a) : 取各元素的絕對值
np.sqrt(a) : 計算各元素的平方根
np.square(a): 計算各元素的平方
np.log(a) np.log10(a) np.log2(a) : 計算各元素的自然對數、10、2為底的對數
np.ceil(a) np.floor(a) : 計算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)
np.rint(a) : 各元素 四舍五入
np.modf(a) : 將數組各元素的小數和整數部分以兩個獨立數組形式返回
np.exp(a) : 計算各元素的指數值
np.sign(a) : 計算各元素的符號值 1(+),0,-1(-)
.
np.maximum(a, b) np.fmax() : 比較(或者計算)元素級的最大值
np.minimum(a, b) np.fmin() : 取最小值
np.mod(a, b) : 元素級的模運算
np.copysign(a, b) : 將b中各元素的符號賦值給數組a的對應元素
ndarray數組的創建
np.arange(n) ; 元素從0到n-1的ndarray類型,range的numpy版
np.ones(shape): 生成全1
np.zeros((shape), ddtype = np.int32) : 生成int32型的全0
np.full(shape, val): 生成全為val
np.eye(n) : 生成單位矩陣
np.ones_like(a) : 按數組a的形狀生成全1的數組
np.zeros_like(a): 同理
np.full_like (a, val) : 同理
np.linspace(1,10,4): 根據起止數據等間距地生成數組
np.linspace(1,10,4, endpoint = False):endpoint 表示10是否作為生成的元素
np.concatenate():
數據的CSV文件存取
CSV (Comma-Separated Value,逗號分隔值) 只能存儲一維和二維數組
np.savetxt(frame, array, fmt=’% .18e’, delimiter = None): frame是文件、字符串等,可以是.gz .bz2的壓縮文件; array 表示存入的數組; fmt 表示元素的格式 eg: %d % .2f % .18e ; delimiter: 分割字符串,默認是空格
eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ )
np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False) : frame是文件、字符串等,可以是.gz .bz2的壓縮文件; dtype:數據類型,讀取的數據以此類型存儲; delimiter: 分割字符串,默認是空格; unpack: 如果為True, 讀入屬性將分別寫入不同變量。
多維數據的存取
a.tofile(frame, sep=’’, format=’%s’ ) : frame: 文件、字符串; sep: 數據分割字符串,如果是空串,寫入文件為二進制 ; format:: 寫入數據的格式
eg: a = np.arange(100).reshape(5, 10, 2)
a.tofile(“b.dat”, sep=”,”, format=’%d’)
np.fromfile(frame, dtype = float, count=-1, sep=’’): frame: 文件、字符串 ; dtype: 讀取的數據以此類型存儲; count:讀入元素個數, -1表示讀入整個文件; sep: 數據分割字符串,如果是空串,寫入文件為二進制
PS: a.tofile() 和np.fromfile()要配合使用,要知道數據的類型和維度。
np.save(frame, array) : frame: 文件名,以.npy為擴展名,壓縮擴展名為.npz ; array為數組變量
np.load(fname) : frame: 文件名,以.npy為擴展名,壓縮擴展名為
np.save() 和np.load() 使用時,不用自己考慮數據類型和維度。
numpy隨機數函數
numpy 的random子庫
rand(d0, d1, …,dn) : 各元素是[0, 1)的浮點數,服從均勻分布
randn(d0, d1, …,dn):標準正態分布
randint(low, high,( shape)): 依shape創建隨機整數或整數數組,范圍是[ low, high)
seed(s) : 隨機數種子
shuffle(a) : 根據數組a的第一軸進行隨機排列,改變數組a
permutation(a) : 根據數組a的第一軸進行隨機排列, 但是不改變原數組,將生成新數組
choice(a[, size, replace, p]) : 從一維數組a中以概率p抽取元素, 形成size形狀新數組,replace表示是否可以重用元素,默認為False。
eg: ?
replace = False時,選取過的元素將不會再選取
uniform(low, high, size) : 產生均勻分布的數組,起始值為low,high為結束值,size為形狀
normal(loc, scale, size) : 產生正態分布的數組, loc為均值,scale為標準差,size為形狀
poisson(lam, size) : 產生泊松分布的數組, lam隨機事件發生概率,size為形狀
eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4))
numpy的統計函數
sum(a, axis = None) : 依給定軸axis計算數組a相關元素之和,axis為整數或者元組
mean(a, axis = None) : 同理,計算平均值
average(a, axis =None, weights=None) : 依給定軸axis計算數組a相關元素的加權平均值
std(a, axis = None) :同理,計算標準差
var(a, axis = None): 計算方差
eg: np.mean(a, axis =1) : 對數組a的第二維度的數據進行求平均
a = np.arange(15).reshape(3, 5)
np.average(a, axis =0, weights =[10, 5, 1]) : 對a第一各維度加權求平均,weights中為權重,注意要和a的第一維匹配
min(a) max(a) : 計算數組a的最小值和最大值
argmin(a) argmax(a) : 計算數組a的最小、最大值的下標(注:是一維的下標)
unravel_index(index, shape) : 根據shape將一維下標index轉成多維下標
ptp(a) : 計算數組a最大值和最小值的差
median(a) : 計算數組a中元素的中位數(中值)
eg:a = [[15, 14, 13],
[12, 11, 10] ]
np.argmax(a) –> 0
np.unravel_index( np.argmax(a), a.shape) –> (0,0)
numpy的梯度函數
np.gradient(a) : 計算數組a中元素的梯度,f為多維時,返回每個維度的梯度
離散梯度: xy坐標軸連續三個x軸坐標對應的y軸值:a, b, c 其中b的梯度是(c-a)/2
而c的梯度是: (c-b)/1
當為二維數組時,np.gradient(a) 得出兩個數組,第一個數組對應最外層維度的梯度,第二個數組對應第二層維度的梯度。
??? 圖像的表示和變換
PIL, python image library 庫
from PIL import Image
Image是PIL庫中代表一個圖像的類(對象)
im = np.array(Image.open(“.jpg”))
im = Image.fromarray(b.astype(‘uint8’)) # 生成
im.save(“路徑.jpg”) # 保存
im = np.array(Image.open(“.jpg”).convert(‘L’)) # convert(‘L’)表示轉為灰度圖
一、生成數據表
pandas內置了三個數據結構,一維的Series,二維的DataFrame,三維的Panel。你可以把DataFrame看做容器,容器元素是Series,可以把Panel看做容器,容器元素是DataFrame。可以對容器進行插入、刪除操作,操作方式和python中的字典很相似。
DataFrame的index就是每一行的id,column就是數據庫表的列名。與其對應的是axis=0,axis=1。
Series的長度就不可變,一旦創建,長度就不能修改。和Series不同,DataFrame可以增加、刪除列。
pandas中的大多數方法不會直接在傳入的參數上進行操作,而是返回一個新的結果對象。
1、首先導入pandas庫,一般都會用到numpy庫,所以我們先導入備用:
??? import numpy as np
??? import pandas as pd
2、導入CSV或者xlsx文件:
??? df = pd.DataFrame(pd.read_csv('name.csv',header=1))
??? df = pd.DataFrame(pd.read_excel('name.xlsx'))
3、用pandas創建數據表:
??? df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
???? "date":pd.date_range('20130102', periods=6),
????? "city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
???? "age":[23,44,54,32,34,32],
???? "category":['100-A','100-B','110-A','110-C','210-A','130-F'],
????? "price":[1200,np.nan,2133,5433,np.nan,4432]},
????? columns =['id','date','city','category','age','price'])
2、數據表信息查看
1、維度查看:
df.shape
2、數據表基本信息(維度、列名稱、數據格式、所占空間等):
df.info()
3、每一列數據的格式:
df.dtypes
4、某一列格式:
df['B'].dtype
5、空值:
df.isnull()
6、查看某一列空值:
df.isnull()
7、查看某一列的唯一值:
df['B'].unique()
8、查看數據表的值:
df.values
9、查看列名稱:
df.columns
10、查看前10行數據、后10行數據:
??? df.head() #默認前10行數據
??? df.tail()??? #默認后10 行數據
三、數據表清洗
1、用數字0填充空值:
df.fillna(value=0)
2、使用列prince的均值對NA進行填充:
df['prince'].fillna(df['prince'].mean())
3、清楚city字段的字符空格:
df['city']=df['city'].map(str.strip)
4、大小寫轉換:
df['city']=df['city'].str.lower()
5、更改數據格式:
df['price'].astype('int')????? ?
6、更改列名稱:
df.rename(columns={'category': 'category-size'})
7、刪除后出現的重復值:
df['city'].drop_duplicates()
8、刪除先出現的重復值:
df['city'].drop_duplicates(keep='last')
9、數據替換:
df['city'].replace('sh', 'shanghai')
四、數據預處理
??? df1=pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006,1007,1008],
??? "gender":['male','female','male','female','male','female','male','female'],
??? "pay":['Y','N','Y','Y','N','Y','N','Y',],
??? "m-point":[10,12,20,40,40,40,30,20]})
1、數據表合并
??? df_inner=pd.merge(df,df1,how='inner')? # 匹配合并,交集
??? df_left=pd.merge(df,df1,how='left')??????? #
??? df_right=pd.merge(df,df1,how='right')
??? df_outer=pd.merge(df,df1,how='outer')? #并集
2、設置索引列
df_inner.set_index('id')
3、按照特定列的值排序:
df_inner.sort_values(by=['age'])
4、按照索引列排序:
df_inner.sort_index()
5、如果prince列的值>3000,group列顯示high,否則顯示low:
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
6、對復合多個條件的數據進行分組標記
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
7、對category字段的值依次進行分列,并創建數據表,索引值為df_inner的索引列,列名稱為category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']))
8、將完成分裂后的數據表和原df_inner數據表進行匹配
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)
??? 1
五、數據提取
主要用到的三個函數:loc,iloc和ix,loc函數按標簽值進行提取,iloc按位置進行提取,ix可以同時按標簽和位置進行提取。
1、按索引提取單行的數值
df_inner.loc[3]
2、按索引提取區域行數值
df_inner.iloc[0:5]
3、重設索引
df_inner.reset_index()
4、設置日期為索引
df_inner=df_inner.set_index('date')
5、提取4日之前的所有數據
df_inner[:'2013-01-04']
6、使用iloc按位置區域提取數據
df_inner.iloc[:3,:2] #冒號前后的數字不再是索引的標簽名稱,而是數據所在的位置,從0開始,前三行,前兩列。
7、適應iloc按位置單獨提起數據
df_inner.iloc[[0,2,5],[4,5]] #提取第0、2、5行,4、5列
8、使用ix按索引標簽和位置混合提取數據
df_inner.ix[:'2013-01-03',:4] #2013-01-03號之前,前四列數據
9、判斷city列的值是否為北京
df_inner['city'].isin(['beijing'])
10、判斷city列里是否包含beijing和shanghai,然后將符合條件的數據提取出來
df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])]
11、提取前三個字符,并生成數據表
pd.DataFrame(category.str[:3])
六、數據篩選
使用與、或、非三個條件配合大于、小于、等于對數據進行篩選,并進行計數和求和。
1、使用“與”進行篩選
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]
2、使用“或”進行篩選
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age'])
3、使用“非”條件進行篩選
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id'])
4、對篩選后的數據按city列進行計數
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
5、使用query函數進行篩選
df_inner.query('city == ["beijing", "shanghai"]')
6、對篩選后的結果按prince進行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
七、數據匯總
主要函數是groupby和pivote_table
1、對所有的列進行計數匯總
df_inner.groupby('city').count()
2、按城市對id字段進行計數
df_inner.groupby('city')['id'].count()
3、對兩個字段進行匯總計數
df_inner.groupby(['city','size'])['id'].count()
4、對city字段進行匯總,并分別計算prince的合計和均值
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])
八、數據統計
數據采樣,計算標準差,協方差和相關系數
1、簡單的數據采樣
df_inner.sample(n=3)
2、手動設置采樣權重
??? weights = [0, 0, 0, 0, 0.5, 0.5]
??? df_inner.sample(n=2, weights=weights)
3、采樣后不放回
df_inner.sample(n=6, replace=False)
4、采樣后放回
df_inner.sample(n=6, replace=True)
5、 數據表描述性統計
df_inner.describe().round(2).T #round函數設置顯示小數位,T表示轉置
6、計算列的標準差
df_inner['price'].std()
7、計算兩個字段間的協方差
df_inner['price'].cov(df_inner['m-point'])
8、數據表中所有字段間的協方差
df_inner.cov()
9、兩個字段的相關性分析
df_inner['price'].corr(df_inner['m-point']) #相關系數在-1到1之間,接近1為正相關,接近-1為負相關,0為不相關
10、數據表的相關性分析
df_inner.corr()
九、數據輸出
分析后的數據可以輸出為xlsx格式和csv格式
1、寫入Excel
df_inner.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc')
2、寫入到CSV
df_inner.to_csv('excel_to_python.csv')
---------------------
原文:https://blog.csdn.net/Yasin0/article/details/82748430
?
總結
以上是生活随笔為你收集整理的机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 学习 —— Numpy 、
- 下一篇: 再谈fedora下的音乐和视频播放器的安