NumPy 學習筆記三

一、ndarray:一種多維數組對象

1、創建ndarray

創建數組最簡單的方法就是使用array()函數,其可接受一切序列型的對象(包括其他數組)

(1)列表形式轉換

(2)創建指定長度或形狀的全0和全1數組

其中全0獲取全1的一維數組只需要一層括號,二維及以上使用兩層括號。np.ones()產生指定維度大小的全1數組,np.zeros()產生指定維度大小的全0數組,np.empty()產生指定長度維度大小的新數組,只分配內存空間,不填充任何值

(3)創建規則方陣【np.eye()】與矩形方陣【np.identity()】

1) np.eye()

傳入三個參數np.eye(m,n,k),其中前兩個(m,n)表示矩陣的行列數,而k表示爲單位矩陣左上角第一個1的索引開始位置,結果如下所示

注:當np.eye()中的m=n,並且k=0時結果與np.identity()等價

2) np.identity()  規則的方單位矩陣

只能傳入一個參數,即方陣的大小

2、數組與標量之間的運算

數組很重要,對數據進行的是批量運算,通常叫矢量化,大小相等的數組之間的任何算術運算都會講運算應用到元素級

不同大小的數組之間的運算叫廣播

3、基本的索引與切片

(1)一維數組索引、指定位置賦值

(2)二維數組索引

二維數組的各索引位置上的元素不再是標量,而是一維數組,要取得元素需要遞歸訪問

二維索引方式如下示

(3)多維數組索引順序與賦值【這裏以三維數組2*2*3數組爲例】

索引由最外層的括號開始往內翻

(4)切片索引【與python列表的一維對象類似】

普通切片形狀及其維度

切片與非切片【這裏表示是否取軸,冒號】區別 

4、布爾型索引

對選擇除‘Bob’以外的其他值,即可以使用不等於好(!=),也可以使用&(與)及| (或) 之類的布爾運算符

5、花式索引

取兩層列表,第一層包含行索引,第二層包含列索引,每次取每一層的一個元素,組合取值

爲了選取矩形區域形式,使用以下方法【第一次取數組的索引,其次再對各個數組取值組合,即第二次選擇的第一個指的是每個數組的取值個數,第二個爲取數組內值的索引】其與  np.ix_  函數等價a

二、通用函數:快速的元素級數組函數

通用函數(即ufunc)是一種對ndarray中的數據執行元素級運算的函數,可將其看成爲簡單函數(接收一個或多個標量值,並且產生一個或多個標量值)的矢量化包裝器

1、許多ufunc都是簡單的元素級變體,sqrt,exp【一元ufunc】

2、接收2個數組的二元ufunc【如:maximum() 函數】

3、有些ufunc返回多個數組【如:modf】

其中modf返回兩個數組,即將數組的小數部分和整數部分以兩個獨立的數組形式返回

4、其他ufunc函數

(1) 一元ufunc

函數 說明
abs、fabs 計算整數、浮點數、複數的絕對值,對於非複數值,可使用更快的abs

sqrt

計算各元素的平方根,等價於arr**0.5
square 計算各元素的平方,等價於arr**2
exp 計算各元素的指數e^x
log、log10、log2、log1p 分別爲自然對數(底數爲e)、底數爲10、底數爲2的log、log(1+x)
sign 計算各元素的正負號,1(正數)、0(零)、-1(負數)
ceil 計算各元素的ceiling值,即大於等於該值的最小整數【上取整】
floor

計算各元素的floor值,即小於等於該值的最大整數

【下取整】

rint 將各元素值進行四捨五入到最接近的整數,保留dtype
modf 將數組的小數與整數部分以兩個獨立的數組返回
isnan 返回哪些值NaN類型的布爾型數組
isfinite、isinf 分別返回一個表示哪些元素爲有窮的,哪些爲無窮的布爾型數組
cos、cosh、sin、sinh 普通型和雙曲線型三角函數
tan、tanh 普通型和雙曲線型三角函數

(2)二元ufunc

函數 說明
add 將數組中的對應元素相加
subtract 從第一個數組中減去第二個數組中的元素【主動減】
multiply 將數組元素進行相乘
divide、floor_divide 除法或向下圓整除法
power 對第一個數組中的A,根據第二個數組中的元素B,計算A^B
maximum、fmax 元素級的最大值計算、fmax將忽略NaN
minimum、fmin 元素級的最小值計算、fmin將忽略NaN
mod 元素級的求模計算(除法的餘數)
copysign 將第二個數組中的值的符號複製給第一個數組中的值
greater、greater_equal 執行元素級的比較計算,最終產生布爾型數組,相當於中綴運算>、>=、<、<=、
equal、not_equal ==、!=
logical_and、logical_or 執行元素級的真值邏輯運算、相當於中綴運算符&、| 、
logical_xor

 ^

 

 

 

 

三、利用數組進行數據處理

1、將條件邏輯表述爲數組運算

如下所示,根據conf的布爾值來分別從兩個數組中取值,根據表達式可知,當conf中爲True時,取xarr數組中該索引位置的值,如果conf爲False時,取yarr數組中該索引位置的值。

上述是使用純python完成的,對於大數組時,處理速度很慢,而且無法使用與多維數組,可以使用numpy裏的where()函數完成相同的操作,並能解決上述問題。

其中np.where()函數中的第二三個參數不一定爲數組形式,也可以爲標量。如下

2、數學與統計方法【累和、均值、方差、標準差等】

可以對整個數組或者對某個軸向的數據進行統計計算。

axis=0表示對每一列、axis=1表示對每一行求解

求解數組每一層不斷累加和、數組不每一層不斷累乘

基本數組統計方法

方法 說明
sum 對數組中全部或某個軸向的元素進行求和、零長度的數組sum爲0
std、var 分別計算標準差和方差,自由度可調
min、max 最大值和最小值
argmin、argmax 分別爲最小值、最大值元素的索引
cumsum 所有元素的累計和
cumprod 所有元素的累計積
mean 算術平均數,零長度的數組的mean爲NaN

3、用於布爾型數組的方法

布爾值會被強制轉換爲1(True)和0(False),因此sum常用於對布爾型數組中的True進行計數

(1)sum的使用

 

(2)any和all的使用

其中any用於測試數組中是否存在一個或多個True【只要含有一個True,則返回True,只有當所有值均爲False時,才返回False】,而all則檢查數組中所有值是否均爲True【只有數組內全部值均爲True時,則返回True,否則均返回False】

4、排序【sort()函數】

與python內置列表類型一樣,NumPy數組也可通過數組的sort()方法進行就地排序【無返回值,但改變原數組,如下arr即變化了】

對多維數組也可以進行排序,可對其傳入任何一個軸進行排序,可直接傳遞軸序號(axis值)

謹記:但對於頂級方法np.sort()方法則返回的是數組的已排序副本,不同於上述的數組方法的sort()方法,這裏np.sort()不改變原數組

5、唯一化及其他集合邏輯

(1)np.unique的使用與原python代碼的對比

(2)np.in1d的使用【用於測試一個數組中的值在另一個數組中的成員資格,返回布爾型數組】

(3)數組的其他等集合操作

方法 說明
unique(x) 計算x中的唯一值,並且返回有序結果
in1d(x,y) 得到‘x中的元素是否在y中’的布爾型數組,長度與x相同
intersect1d(x,y) 計算x和y的公共元素,並返回有序結果

union1d(x,y)

計算x和y的並集,並返回有序結果
setdiff1d(x,y) 計算x和y的集合差,即元素在x內卻不在y內
setxor1d(x,y) 計算x和y的集合對稱差,即存在於一個數組中但不同時存在於兩個數組的元素

四、用於數組的文件輸入輸出

NumPy能夠讀寫磁盤上的文本數據或二進制數據

1、將數組以二進制格式保存到磁盤【np.save()、np.savez、np.load()函數】

(1)保存、讀取單個文件

由上圖可知,np.save()函數需要傳遞兩個參數,第一個爲需要存儲的文件名(可不寫後綴名,生成時會自動補上後綴名.npy),第二個爲需要存儲的內容。讀取使用np.load()函數。【傳入文件名即可,文件名包含後綴名】

(2)保存讀取多個文件【將多個數組存爲一個壓縮文件,數組以關鍵字形式傳入即可】

保存使用np.savez(),需要傳入的參數,第一個參數爲爲需要保存的文件名(也可以不寫後綴名,生成自動補上.npz),第二個即後面的均爲需要一起保存的數據

加載.npz文件是,會得到一個類似字典的對象,該對象會對各個數組進行延遲加載,因爲存儲時,傳入的第一個文件的名爲a,則讀取時,該名將作爲鍵,同理存儲的名字爲b,加載時也作爲鍵。

2、讀取文本文件【如np.loadtxt()】

其中np.loadtxt() 函數需要傳入的參數是,文件名、分隔標記(delimiter  一般爲逗號或者 空格等)

np.savetxt則執行的是相反的操作:將數組寫到以某種分隔符隔開的文本文件中。而genfromtxt和loadtxt類似,只不過它面向的是結構化數組和缺失數據處理。

五、線性代數補充

1、矩陣乘法(dot)

2、QR分解

3、常用的numpy.linalg函數

函數 說明
diag 以一維數組的形式返回方陣的對角線(或非對角線)元素,或將一維數組轉爲方陣(非對角線元素爲0)
dot 矩陣乘法
trace 計算對角線元素的和【跡】
det 計算矩陣的行列式
eig 計算方陣的特徵值與特徵向量【返回兩個參數】
inv 計算方陣的逆
pinv 計算矩陣的Moore-Penrose僞逆
qr 計算QR分解
svd 計算奇異值分解(SVD)
solve 解線性方程組Ax=b, 其中A爲一個方陣
lstsq 計算Ax=b的最小二乘解

六、隨機數生成

部分常用的numpy.random函數

函數 說明
seed 確定隨機數生成器的種子
permutation 返回一個序列的隨機排列或返回一個隨機排列的範圍
shuffle 返回一個序列就地隨機排列
rand 產生均勻分佈的樣本值
randint 從給定的上下限範圍內隨機選取整數
randn 產生正態分佈(平均值爲0,標準差爲1)的樣本值,類似於Matlab接口
binomial 產生二項分佈的樣本值
normal 產生正態(高斯)分佈的樣本值
beta 產生Beta分佈的樣本值
chisquare 產生卡方分佈的樣本值
gamma 產生Gamma分佈的樣本值
uniform 產生在[0-1)中均勻分佈的樣本值【包含0不包含1】

 

 

 

 

 

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