一、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】 |