點擊上方「機器學習與生成對抗網絡」,關注"星標"算法
獲取有趣、好玩的前沿乾貨!數組
文僅交流,侵刪微信
numpy能夠說是Python運用於人工智能和科學計算的一個重要基礎,近段時間剛好學習了numpy,pandas,sklearn等一些Python機器學習和科學計算庫,所以在此總結一下經常使用的用法。
網絡
引入numpy庫的方式:import numpy as np
一、numpy數組(array)的建立
經過array方式建立,向array中傳入一個list實現
一維數組的建立:
二維數組的建立:傳入一個嵌套的list便可,以下例
經過arange建立數組:下例中建立一個0~1間隔爲0.1的行向量,從0開始,不包括1,第二個例子經過對齊廣播方式生成一個多維的數組。
經過linspace函數建立數組:下例中建立一個0~1間隔爲1/9的行向量(按等差數列形式生成),從0開始,包括1.
經過logspace函數建立數組:下例中建立一個1~100,有20個元素的行向量(按等比數列形式生成),其中0表示10^0=1,2表示10^2=100,從1開始,包括100
生成特殊形式數組:
生成全0數組(zeros()函數),生成全1數組(ones()函數), 僅分配內存但不初始化的數組(empty()函數)。注意要指定數組的規模(用一個元組指定),同時要指定元素的類型,不然會報錯
生成隨機數組
經過frombuffer,fromstring,fromfile和fromfunction等函數從字節序列、文件等建立數組,下例中生成一個9*9乘法表
二、顯示、建立、改變的數組元素的屬性、數組的尺寸(shape)等
三、改變數組的尺寸(shape)
reshape方法,第一個例子是將43矩陣轉爲34矩陣,第二個例子是將行向量轉爲列向量。注意在numpy中,當某個軸的指定爲-1時,此時numpy會根據實際的數組元素個數自動替換-1爲具體的大小,如第二例,咱們指明瞭c僅有一列,而b數組有12個元素,所以c被自動指定爲12行1列的矩陣,即一個12維的列向量。
四、元素索引和修改
簡單的索引形式和切片:
當使用布爾數組b做爲下標存取數組x中的元素時,將收集數組x中全部在數組b中對應下標爲True的元素。使用布爾數組做爲下標得到的數組不和原始數組共享數據空間,注意這種方式只對應於布爾數組(array),不能使用布爾列表(list)。(附註:當布爾數組的長度與被索引的數組的長度短時,不足的部分都看成False)
利用條件進行索引:利用不等式等進行索引
多維數組的索引和切片(右邊框圖中的顏色和左邊的指令的顏色相對應):
一樣的,能夠採用bool型的方式對數組進行索引和切片操做
其實多維數組的索引仍是很好理解的,例以下例中,咱們能夠看到對於一個張量,也就是b,對其索引是,[i,j,k]中的i表示選擇第幾個二維數組,而後j表示取二維數組中的第幾個行向量,k表示取行向量中的第幾個元素。
五、ufunc操做
ufunc是universal function的縮寫,它是一種能對數組的每一個元素進行操做的函數。numPy內置的許多ufunc函數都是在C語言級別實現的,所以它們的計算速度很是快。下面給一個計算sin函數(sin函數計算數組中所有元素的sin值)的小實例:
四則運算符能夠直接用於數組(一維或多維)計算:app
比較操做也可直接進行,以下,比較x1和x2各對應元素的大小,返回的是一個bool型數組。同理,可用的操做符有 ‘==’,‘!=’,‘<’,‘>’,‘<=’,‘>=’等。另外可使用數組的any()或all()方法。只要數組中有一個值爲True,則any()返回True;而只有數組的所有元素都爲True,all()才返回True。機器學習
想要了解更多的numpy自帶的ufunc函數,能夠查看這篇博客:函數
numpy教程:數學函數和基本統計函數學習
https://blog.csdn.net/pipisorry/article/details/41214819人工智能
自定義ufunc函數:frompyfunc(func,nin,nout) 函數能夠將計算單個值的函數轉換成一個可對數組中每一個元素進行計算的ufunc函數。其中nin是輸入func的參數的個數,nout是func返回值的個數。以下例。spa
reduce方法(與Python的reduce函數相似,其沿着axis軸對array進行操做)
accumulate方法(其做用和reduce方法相似,可是會保存中間結果)
outer方法(對其兩個參數數組的每兩對元素的組合進行運算,計算外積):若數組a的維數爲M,數組b的維數爲N,則ufunc函數op的outer()方法對a、b數組計算所生成的數組c的維數爲M+N,c的形狀是a、b的形狀的結合。例如a的形狀爲(2,3),b的形狀爲(4,5),則c的形狀爲(2,3,4,5)。
六、廣播操做
廣播是針對形狀不一樣的數組的運算採起的操做。
當咱們使用ufunc函數對兩個數組進行計算時,ufunc函數會對這兩個數組的對應元素進行計算,所以它要求這兩個數組有相同的大小(shape相同)。若是兩個數組的shape不一樣的話(行列規模不等),會進行以下的廣播(broadcasting)處理:
1). 讓全部輸入數組都向其中shape最長的數組看齊,shape中不足的部分都經過在前面加1補齊。所以輸出數組的shape是輸入數組shape的各個軸上的最大值(往最大軸長上靠)。
2). 若是輸入數組的某個軸和輸出數組的對應軸的長度相同或者其長度爲1時,這個數組可以用來計算,不然出錯。
3). 當輸入數組的某個軸的長度爲1時,沿着此軸運算時都用此軸上的第一組值。
感受說的不太明白,因而仍是用實例說話好了。
七、矩陣運算
矩陣乘法(dot乘法,注意要符合矩陣乘法規則)
內積(inner,計算向量/矩陣內積):和dot乘積同樣,對於兩個一維數組,計算的是這兩個數組對應下標元素的乘積和;對於多維數組a和b,它計算的結果數組中的每一個元素都是數組a和b的最後一維的內積,所以數組a和b的最後一維的長度必須相
計算公式爲:
inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
外積(outer,計算外積):只按照一維數組進行計算,若是傳入參數是多維數組,則先將此數組展平爲一維數組以後再進行運算。outer乘積計算的列向量和行向量的矩陣乘積
解線性方程組(solve):solve(a,b)有兩個參數a和b。a是一個N*N的二維數組,而b是一個長度爲N的一維數組,solve函數找到一個長度爲N的一維數組x,使得a和x的矩陣乘積正好等於b,數組x就是多元一次方程組的解。
八、文件存取(假設有數組array爲a,假定類型爲int32)
a.tofile(file_name) ,保存a到file_name文件中,file_name爲字符串類型,如‘a.txt’等;從文件中讀回a數組時須要指明類型,如b=np.fromfile(file_name,dtype=np.float)時會報錯,正確的使用方式是b=np.fromfile(file_name,dtype=np.int32)
save和load方法(寫入文件和從文件讀回都不須要指明類型,存儲文件類型爲npy格式文件):
np.save(「a.npy」, a) # 將array a存入a.npy文件中
c = np.load( 「a.npy」 ) # 從a.npy文件中讀回array a
savetxt和loadtxt方法(保存爲txt格式文件):
np.savetxt(「a.txt」, a) # 將array a存入a.txt文件中
np.loadtxt(「a.txt」) # 從a.txt文件中讀回array a
猜您喜歡:
附下載 |《TensorFlow 2.0 深度學習算法實戰》
本文分享自微信公衆號 - 機器學習與生成對抗網絡(AI_bryant8)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。