機器學習(numpy庫)

導入numpy庫:import numpy as np;

創建numpy對象:通過numpy.array來實現;

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
參數說明
object 數組或者是嵌套的數組
dtype 元素的數據類型(可選)
copy 布爾值,對象是否需要複製(可選)
order 創建數組的樣式C爲行方向,F爲列方向,A爲任意方向(默認)
ndmin 指定最小的維度
subok 默認返回一個與基類類型一致的數組

實例:(對創建np.array及其參數的使用)

a = np.array([[1,  2],  [3,  4]])      #創建np.array對象
print (a)        #打印輸出a

輸出結果:
[[1,2],
[3,4]]

a = np.array([1,  2,  3,  4,  5], ndmin =  2)   #ndmin參數的使用(參數爲常數)
print (a)        #打印輸出a

輸出結果:
[[1,2,3,4,5]]     # 2維(最大的括號匹配)

a = np.array([1,  2,  3], dtype = complex)  #dtype參數的使用(類型與常用變量類型一致)
print (a)        #打印輸出a

輸出結果:
[1+0.j,2+0.j,3+0.j]    #元素的數據類型爲複數類型

numpy對象的屬性:(下表爲np.array對象中常用的屬性)

np.array常用屬性
ndarray.ndim 秩,即軸的數量或維度的數量
ndarray.shape 數組的維度,對於矩陣,n 行 m 列
ndarray.size 數組元素的總個數,相當於 .shape 中 n*m 的值
ndarray.dtype ndarray 對象的元素類型
ndarray.real ndarray元素的實部
ndarray.imag ndarray 元素的虛部

實例:(np.array的屬性實例操作)

a=np.array([[1,2],[4,5],[4,8]])
print(a.size)       #打印輸出元素個數,  輸出結果爲 6
print(a.shape)      #打印輸出對象的形狀(元組類型(m,n)),m爲行,n爲列,  輸出結果爲(3,2)
print(a.dtype)      #打印輸出對象元素的數據類型。 輸出結果爲Int32
print(a.ndim)       #打印輸出對象的秩。     輸出結果爲2
print(a.real,a.imag)#打印元素的實部和虛部     #輸出形狀與np.array的形狀一致
#[[1,2],       [[0,0],
# [4,5]         [0,0],
# ,[4,8]]       [0,0]]

 創建numpy數組:empty,zeros,ones(分別創建空,0,1數組)

numpy.empty(shape, dtype = None, order = 'C')   #創建指定形狀的數組,數組元素隨機填充:
numpy.zeros(shape, dtype = None, order = 'C')   #創建指定形狀的數組,數組元素以 0 來填充:
numpy.ones(shape, dtype = None, order = 'C')    #創建指定形狀的數組,數組元素以 1 來填充:

再者還可以用定義取創建數組,通常上述創建過程用於初始化參數
參數說明
shape 數組形狀
dtype 數據類型,可選
order 有"C"和"F"兩個選項,分別代表,行優先和列優先,在計算機內存中的存儲元素的順序。

從數值範圍來創建數組: 

numpy.arange(start, stop, step, dtype)
#這裏的start爲起始位置(默認爲0),stop爲終止位置(不包含此值),
#step爲步長(默認爲1),dtype爲元素數據類型

np.linspace(start, stop, num=number, endpoint=True, retstep=False, dtype=None)
#創建一個個數爲number的等差數列,start爲起始位置,stop爲結束位置,num爲元素個數
#endpoint 設爲 false,不包含終止值;反之包含終止值

np.logspace(start, stop, num=number, endpoint=True, base=10.0, dtype=None)
#創建一個個數爲number的等比數列,start爲起始位置,stop爲結束位置,num爲元素個數,base爲log的底數
#endpoint 設爲 false,不包含終止值;反之包含終止值

Numpy的高級操作(切片&索引&廣播):

ndarray對象的內容可以通過索引或切片來訪問和修改,與 Python 中 list 的切片操作一樣。ndarray 數組可以基於 0 - n 的下標進行索引,切片對象可以通過內置的 slice 函數,並設置 start, stop 及 step 參數進行,從原數組中切割出一個新數組。 

a = np.arange(10)       #創建一個nparray對象其值爲 [0,1,2,3,4,5,6,7,8,9]
print(a)
print(a[slice(2,7,2)])  
#通過slice函數來對其進行切片,步長爲2,起始位置爲2,終止位置爲7,輸出結果[2,4,6]
print(a[2:7:2])         
#通過[start:end:step]方式對ndarray進行切片,當沒有end時默認到最後一個位置,沒有step默認爲1

在多維數組的分割中,不同的維度之間用‘’,‘’進行分割。如:

a=np.arange(0,12)
a.shape=(3,4)
print(a)
print(a[0:2,1:3])

數據結果爲:
[[1,2],
[5,6]]  獲取第0和第1行與第1與第2列相交的部分。

Numpy的廣播機制:

廣播是 numpy 對不同形狀(shape)的數組進行數值計算的方式, 對數組的算術運算通常在相應的元素上進行。如果兩個數組 a 和 b 形狀相同,即滿足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 數組對應位相乘。這要求維數相同,且各維度的長度相同。當運算中的 2 個數組的形狀不同時,numpy 將自動觸發廣播機制。

a = np.array([1,2,3,4]) 
b = np.array([10,20,30,40]) 
c = a * b         #對應元素做運算
print (c) #輸出結果爲[10,40,90,160],形狀大小不變

a = np.array([[ 0, 0, 0],
           [10,10,10],
           [20,20,20],
           [30,30,30]])
b = np.array([1,2,3])    #列的維數相同,行的方向進行廣播
print(a + b)

輸出結果爲:
[[1,2,3],
[11,12,13],
[21,22,23],
[31,32,33]]

 廣播機制圖如下所示:(相當於把小的對象擴展到與大的對象形狀一致後在進行運算)

廣播的規則: 

1)讓所有輸入數組都向其中形狀最長的數組看齊,形狀中不足的部分都通過在前面加 1 補齊。

2)輸出數組的形狀是輸入數組形狀的各個維度上的最大值。

3)如果輸入數組的某個維度和輸出數組的對應維度的長度相同或者其長度爲 1 時,這個數組能夠用來計算,否則出錯。

4)當輸入數組的某個維度的長度爲 1 時,沿着此維度運算時都用此維度上的第一組值。

Numpy數組操作

reshape 不改變數據的條件下修改形狀
flat 數組元素迭代器
flatten 返回一份數組拷貝,對拷貝所做的修改不會影響原始數組
ravel 返回展開數組

Numpy的與、或、非以及異或運算(Numpy的位置運算)

bitwise_and 對數組元素執行位與操作
bitwise_or 對數組元素執行位或操作
invert 按位取反
left_shift 向左移動二進制表示的位
right_shift 向右移動二進制表示的位

 注:也可以使用 "&"、 "~"、 "|" 和 "^" 等操作符進行計算。

a = np.arange(10)       #創建一個nparray對象其值爲 [0,1,2,3,4,5,6,7,8,9]
print(a)                #原始數組
print(a.reshape(2,5))   #改變數組的形狀,[[0,1,2,3,4],[5,6,7,8,9]]
for row in a.reshape(2,5):
    print(row)          #輸出結果爲兩個一維數組[0,1,2,3,4],[5,6,7,8,9]

a=a.reshape(2,5)
for element in a.flat:
    print(element)      #通過flat遍歷數組內所有的元素 輸出結果爲0,1,2,3,4,5,6,7,8,9

print(a.flatten())      #默認按照行遍歷數組,輸出結果爲 0,1,2,3,4,5,6,7,8,9 ,即order='C'
print(a.flatten(order='F'))     #按照列遍歷數組,輸出結果爲0,5,1,6,2,7,3,8,4,9

#數組的轉置 通過T或者transpose實現
print(a.T)
print(a.transpose())        #這裏的T和transpose效果一致

a,b=13,17
print(bin(a),bin(b))        #打印輸出13和17的二進制數
print(np.bitwise_and(a,b),a&b)  #按位與運算
print(np.bitwise_or(a,b),a|b)   #按位或運算
print(np.bitwise_not(a),~a,np.invert(a))        #按位取反運算

'''
b=10001
a=01101  a和b按位與運算00001   結果爲1
         a和b按位或運算11101   結果爲1+4+8+16=29
         01101  --  10010  -- 1 1101 -- 1 1110結果爲-14 
'''

print(np.left_shift(10,2))      #left_shift() 函數將數組元素的二進制形式向左移動到指定位置,右側附加相等數量的 0。
print(np.right_shift(10,2))     #right_shift() 函數將數組元素的二進制形式向右移動到指定位置,左側附加相等數量的 0。
'''
10的二進制表示  01010
左移兩位  00101000   輸出結果爲40
右移兩位  00000010   輸出結果爲2
'''

print(np.binary_repr(num,width="輸出位數")) #輸出指定位的二進制數

字符串函數(常用)

add() 對兩個數組的逐個字符串元素進行連接
multiply() 返回按元素多重連接後的字符串
center() 居中字符串
capitalize() 將字符串第一個字母轉換爲大寫
title() 將字符串的每個單詞的第一個字母轉換爲大寫
lower() 數組元素轉換爲小寫
upper() 數組元素轉換爲大寫
split() 指定分隔符對字符串進行分割,並返回數組列表
splitlines() 返回元素中的行列表,以換行符分割
strip() 移除元素開頭或者結尾處的特定字符
join() 通過指定分隔符來連接數組中的元素
replace() 使用新字符串替換字符串中的所有子字符串
decode() 數組元素依次調用str.decode
encode() 數組元素依次調用str.encode
#字符串連接
print(np.char.add(['hello'],[' world']))  #np.char.add()實現對字符串的連接操作
print(['hello']+[' world'])               #注意‘+’和add的區別
#重複字符串
print(np.char.multiply('hello world ',3))  #多次重複字符串(重複連接)
# np.char.center(str , width,fillchar),字符串居中填充
print(np.char.center('A',5,'*'))    #第一個參數爲字符串,第二個參數爲長度,第三個參數爲填充字符
#第一個字母大寫
print(np.char.capitalize(['hello','world']) )       #將第一個字母大寫
#全部字母大寫
print(np.char.upper(['hello','world']) )            #全部大寫
#全部字母小寫
print(np.char.lower(['hello','world']) )            #全部小寫
#字符串首字母大寫
print(np.char.title(['hello word','i like the world']))  #將每個單詞的第一個首字母大寫
#字符串分割
print(np.char.split(['hello word','i like the world']))  #分隔符默認爲空格,參數sep爲分割字符
#字符串首尾去除特殊字符
print(np.char.strip('ahello worlda','a'))     #移出字符串開頭和結尾的特殊字符(默認爲空格)
#字符串的替換
print(np.char.replace('i like the world','i','xiao ming'))   #替換字符串中的特殊字符,第二個參數爲待替換字符,第三個參數爲替換字符;
#字符串編碼&解碼
print(np.char.encode('hello world','cp500'))        #默認編碼方式爲utf-8
print(np.char.decode(np.char.encode('hello world','cp500'),'cp500'))

 Numpy中的數學函數

1)三角函數:sin,cos,tan,arcsin,arccos,arctan;(通過degrees可將弧度轉化爲角度);

2)舍入函數:around(遵循四捨五入)、floor 下取整函數 、ceil 上取整函數;

print(np.floor(3.14))   #下取整   結果爲3
print(np.ceil(3.14))    #上取整   結果爲4
print(np.around(3.14))  #四捨五入   結果爲3

3)加減乘除: add()subtract()multiply() 和 divide()。(要求操作的數組滿足廣播的規則);

4)取倒數:通過np.reciprocal()實現對元素取倒數;

5)求元素的冪:通過power(a,b) 函數,求解a的b次冪;

6)求餘數:通過mod()函數;(函數 numpy.remainder() 也產生相同的結果。)

a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3])

print(a+b,np.add(a,b))          #矩陣的加法,矩陣的加法  等於  +
print(a-b,np.subtract(a,b))     #矩陣的減法,subtract  等於  -
print(a*b,np.multiply(a,b))     #矩陣的乘法,multiply  等於  *
print(a/b,np.divide(a,b))       #矩陣的除法,divide  等於  -
print(a%b,np.mod(a,b))          #矩陣求餘,  mod  等於  %
print(np.reciprocal(b),1/b)     #取到數  reciprocal  等於  1 / 此數值

7)查找數組中的最大最小值:amax 和 amin(求指定軸方向上的最大和最小值,沒有設定默認爲整個矩陣);

8)計算數組內的最大和最小值之間的差值:ptp()函數;(極差

9)計算矩陣中的中位數:通過median()方法;

10)mean() 函數返回數組中元素的算術平均值。 如果提供了軸,則沿其計算。

11)average() 函數根據在另一個數組中給出的各自的權重計算數組中元素的加權平均值

12)標準差和方差:(公式如下所示(通過上述方法實現))

標準差:std = sqrt(mean((x - x.mean())**2))
方差  :mean((x - x.mean())** 2)
a=np.array([[1,2,3],[4,5,6]])
print(np.amax(a))       #矩陣中的最大值        輸出結果爲 6
print(np.amax(a,0))     #矩陣中列的最大值           輸出結果爲 [4,5,6]
print(np.amax(a,1))     #矩陣中行的最大值(最小值類似)        輸出結果爲 [3,6]
print(np.ptp(a))        #矩陣中最大和最小值的差值      輸出結果爲 5

print(np.median(a))     #全部元素的中位數
print(np.median(a,0))   #對應列的中位數(0爲列)
print(np.median(a,1))   #對應行的中位數(1爲行)

print(np.mean(a))       #全部元素的平均值
print(np.mean(a,0))     #對應列的平均值
print(np.mean(a,1))     #對應行的平均值

#average函數,當不指定權重的時候相當於mean函數;對於第二個參數指定的是軸0爲列,1爲行

Numpy中的排序與條件篩選函數

排序種類表
'quicksort'(快速排序) 1 O(n^2) 0
'mergesort'(歸併排序) 2 O(n*log(n)) ~n/2
'heapsort'(堆排序) 3 O(n*log(n)) 0

 參數a爲待排矩陣;axis爲排序的軸0爲列,1爲行;kind爲排序方式,默認爲快排;order用於指明排序字段;

numpy.sort(a, axis, kind, order);#numpy中的排序

argsort() 函數返回的是數組值從小到大的索引值。

Numpy中的線性代數

dot 兩個數組的點積,即元素對應相乘。一維數組對應元素相乘,二維數組按照矩陣乘積定義求解)
vdot 兩個向量的點積;如果參數是多維數組,它會被展開。(對應元素乘積之和)
inner 兩個數組的內積;返回一維數組的向量內積。對於更高的維度,它返回最後一個軸上的和的乘積。
inv 通過 np.linalg.inv求解矩陣的逆;
det 計算矩陣的行列式;(要求爲方陣)
solve 用於求解矩陣方程的解;
A = np.array([[1,2],[3,4]])
B = np.array([[11,12],[13,14]])
print(A*B)                  #結果爲對應元素的乘積;
print(np.dot(A,B))          #結果爲按照矩陣的乘法所得到的矩陣;
print(np.vdot(A,B))         #爲對應元素乘積之和(11+24+39+56)=130
print(np.inner(A,B))         #兩個矩陣的點積

#inner的求解分步如下所示
print(np.inner([1,2],[11,12]))
print(np.inner([1,2],[13,14]))
print(np.inner([3,4],[11,12]))
print(np.inner([3,4],[13,14]))

#求解矩陣的逆
print(np.linalg.inv(A))     #求矩陣的逆,通過np.linalg.inv求解
#求解矩陣的行列式
print(np.linalg.det(A))     #求矩陣的行列式  -2

A=np.array([[1,0],[0,1]])
B=np.array([[0,],[0,]])
print(np.linalg.solve(A,B))        #通過solve求解矩陣方程的解
print(np.dot(np.linalg.inv(A),B))    #定義求解 A^(-1)B

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章