文章目錄
- 一:簡介
- 二:NumPy庫組成介紹
- 1.NumPy的組成
- 2.NumPy優(yōu)點
- 3.數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型的區(qū)別
- (1)數(shù)據(jù)類型
- (2)數(shù)據(jù)結(jié)構(gòu)
- 4.NumPy數(shù)據(jù)類型
- 三:NumPy ndarray
- 1.簡介
- (1)大型數(shù)組集合
- (2)多維
- (3)相同類型
- (4)類似標量操作語法
- 2.NumPy矩陣和數(shù)組區(qū)別
- 3.shape,dtype,ndim
- 4.生成ndarray
- (1)基礎(chǔ)創(chuàng)建方法
- (2)其他方法
- 5.ndarray的數(shù)據(jù)類型
- 6.NumPy數(shù)組算術(shù)
- (1)向量化
- (2)相同尺寸數(shù)組算術(shù)操作
- (3)不同尺寸數(shù)組算術(shù)操作
- 7.ndarray數(shù)組索引與切片
- (1)基礎(chǔ)索引切片以及與序列的不同
- (2)數(shù)組拷貝
- (3)多維數(shù)組拷貝
- (4)布爾索引
- (5)神奇索引
- 8.數(shù)組轉(zhuǎn)置和換軸
- (1).T屬性,適用于一,二維數(shù)組,如下:
- (2)transpose高維數(shù)組轉(zhuǎn)置
- (3)swapaxes對換軸
- 四:通用函數(shù)
- 五:數(shù)組向量化的一些方法
- 1.條件邏輯
- 2.數(shù)組和統(tǒng)計方法
- 3.布爾值數(shù)組的方法
- 4.排序
- 5.一維數(shù)組基礎(chǔ)集合操作
- 6.使用數(shù)組進行文件輸入和輸出
一:簡介
? ?NumPy系統(tǒng),全稱Numerical Python,是Python的一種開源的數(shù)值計算擴展工具(一種開源的科學計算庫)。可用來存儲和處理大型矩陣,比Python自身的嵌套列表要高效的多。
? ?它是目前Python數(shù)值計算中最為重要的基礎(chǔ)包,大多數(shù)其他數(shù)值計算包都提供了基于NumPy的科學函數(shù)功能,
將Numpy的數(shù)組對象作為數(shù)據(jù)交換的媒介
。
這里要向大家介紹包與庫的區(qū)別
:其實,我們的每個python文件都是模塊;庫是一些有相似功能的模塊的集合;包是對文件目錄進行管理,里面既有模塊,還有子目錄,第一個模塊是__init__模塊。有時候庫和包可以看成一樣的。
? ?說白了,NumPy庫就是提供一個高效高級數(shù)組對象以及操作它的方法,其他科學計算庫大多把這個高級數(shù)組對象進行進一步處理。
二:NumPy庫組成介紹
1.NumPy的組成
(1)一個強大的N維數(shù)組對象Array
? ?一個高級數(shù)據(jù)類型,提供了基于數(shù)組和矩陣的便捷算術(shù)操作以及靈活的廣播函數(shù)庫功能。
(2)對所有數(shù)據(jù)進行快速的矩陣計算
? ?克服了循環(huán)繁瑣的特點,寫入數(shù)據(jù)與讀取數(shù)據(jù)快。
(3)用于整合C/C++和Fortran代碼的工具包
? ?提供了一個非常易用的C語言API,使得數(shù)據(jù)傳遞給底層語言編寫的外部庫,在將計算結(jié)果按照NumPy數(shù)組的形式返回,傳遞給其他高級庫處理更方便與簡單。可以在底層語言中加入Python動態(tài),易用的文件接口,進行數(shù)據(jù)處理功能。
(4)實用的線性代數(shù)、傅里葉變換和隨機數(shù)生成函數(shù)
2.NumPy優(yōu)點
? ?NumPy本身不提供建模和科學函數(shù),它的設(shè)計對于含有大量數(shù)組的數(shù)據(jù)非常有效,理解NumPy數(shù)組以及基于數(shù)組的計算將幫助我們更高效地使用基于數(shù)組的工具。
? ?NumPy像其他語言一樣,將數(shù)據(jù)存儲在連續(xù)的內(nèi)存塊上,由于其算法庫是用C語言寫的,所以在操作數(shù)據(jù)內(nèi)存時,不需要類型檢查或者其他管理。其使用的內(nèi)存量也小于其他Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)序列。
? ?NumPy最好用的是可以針對數(shù)組進行快速遍歷,復(fù)雜計算而不需要寫循環(huán)。這就節(jié)省了時間和內(nèi)存。
3.數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型的區(qū)別
(1)數(shù)據(jù)類型
? ?是一種值的集合和定義在這個值集上的一組操作的總稱。
數(shù)據(jù)類型的分類為:原子類型和結(jié)構(gòu)類型;
原子類型
= 一種值的集合 + 定義在值集合上的一組操作。(比如:python中的int,float,字符串)
結(jié)構(gòu)類型
= 一種數(shù)據(jù)結(jié)構(gòu) + 定義在這種數(shù)據(jù)結(jié)構(gòu)上的一組操作。(比如:python中的列表,字典,元組)
(2)數(shù)據(jù)結(jié)構(gòu)
? ?是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合,包括邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。
? ?因此數(shù)據(jù)結(jié)構(gòu)是一種數(shù)據(jù)類型。
4.NumPy數(shù)據(jù)類型
NumPy提供了N維數(shù)組類型ndarray
,是相同類型的數(shù)據(jù)的多維大數(shù)據(jù)集合。
? ?ndarray在存儲數(shù)據(jù)的時候,數(shù)據(jù)與數(shù)據(jù)的地址都是連續(xù)的,這樣就給使得批量操作數(shù)組元素時速度更快。這種方法和C語言的數(shù)組一樣,也就是用C語言的庫來解決Python運行速度慢的問題。
? ?因為ndarray中的所有元素的類型都是相同的(和C語言的數(shù)組類似),而Python列表中的元素類型是任意的,所以ndarray在存儲元素時內(nèi)存可以連續(xù),而python內(nèi)建數(shù)據(jù)結(jié)構(gòu)list就只能通過尋址方式找到下一個元素。
? ?這在一定程度上可能不夠靈活,但用數(shù)組可以省掉好多循環(huán)語句,而且比較簡單,速度快了好多倍。
三:NumPy ndarray
1.簡介
? ?NumPy的核心之一是N-維數(shù)組對象-ndarray。
它其實就是一個大型同類型數(shù)據(jù)集
,允許一些標量的操作方法(如加減乘除等)對其進行批量計算。
? ?我們先生成一個二維數(shù)組,然后按照標量的操作語法進行操作:
? ?這里我們使用標準的NumPy導(dǎo)入方式import numpy as np。這不是唯一的,但是一個習慣,一般都是這樣導(dǎo)入的,這是為了方便里面的方法與Python內(nèi)建函數(shù)的方法進行區(qū)別。
特點如下:
(1)大型數(shù)組集合
(2)多維
(3)相同類型
(4)類似標量操作語法
2.NumPy矩陣和數(shù)組區(qū)別
注:在NumPy中的,數(shù)組和矩陣是兩個概念,matrix是array的分支,matrix和array在很多時候都是通用的,用哪一個都一樣。但官方建議選擇array,因為array更靈活,速度更快,很多人把二維的array也翻譯成矩陣。
3.shape,dtype,ndim
? ?每一個數(shù)組都有三個常用的屬性,一個是shape屬性,用來表示數(shù)組每一維的數(shù)量;一個是dtype屬性,用來輸出數(shù)組的數(shù)據(jù)類型;ndim輸出形成的維數(shù)。
? ?精通數(shù)組的編程和思考對于研究基于數(shù)組的數(shù)據(jù)分析是十分有用的。
4.生成ndarray
(1)基礎(chǔ)創(chuàng)建方法
? ?用array函數(shù)生成最簡單的數(shù)組。
這里傳到array的shape參數(shù)中,傳的時一個元組,里面是每一維的個數(shù)
,該函數(shù)接受任意的序列對象(序列是是有索引,且默認索引是從0開始,可以分片,有通用的操作符的數(shù)據(jù)類型的統(tǒng)稱,它們是數(shù)據(jù)結(jié)構(gòu)+操作方法的數(shù)據(jù)類型)或者數(shù)組,生成一個新的包含傳遞數(shù)據(jù)的NumPy數(shù)組,還可以給參數(shù)dtype指定數(shù)據(jù)類型。
例如:
這里的二維數(shù)組可以看成是一個矩陣。
而不等長的序列會直接顯示如下:
? ?除非指定,否則np.array會自動推斷生成數(shù)組的數(shù)據(jù)類型。其數(shù)據(jù)類型被存儲在一個特殊的元數(shù)據(jù)dtype。
python默認的數(shù)據(jù)類型是float64(浮點型)
(2)其他方法
還有一些其他方法用于創(chuàng)建不同的數(shù)組:
| 函數(shù)名 | 說明 |
|---|---|
| asarray | 將輸入轉(zhuǎn)換為ndarray,但輸入的已經(jīng)是ndarray則不再復(fù)制 |
| arange | Python內(nèi)建函數(shù)range的數(shù)組版,返回一個數(shù)組 |
| ones | 根據(jù)給定形狀和數(shù)據(jù)類型生成全1數(shù)組 |
| ones_like | 根據(jù)所給的數(shù)組生成一個形狀一樣的全1數(shù)組 |
| zeros | 根據(jù)給定形狀和數(shù)據(jù)類型生成全0數(shù)組 |
| zeros_like | 根據(jù)所給的數(shù)組生成一個形狀一樣的全0數(shù)組 |
| empty | 根據(jù)給定形狀生成一個沒有初始化數(shù)值的空數(shù)組 |
| empty_like | 根據(jù)所給的數(shù)組生成一個形狀一樣但沒有初始化數(shù)值的空數(shù)組 |
| full | 根據(jù)給定形狀和數(shù)據(jù)類型生成指定數(shù)值的數(shù)組 |
| full_like | 根據(jù)所給的數(shù)組生成一個形狀一樣但內(nèi)容是指定數(shù)值的數(shù)組 |
| eye,identity | 生成一個特征矩陣(對角線位置都是1,其余位置是0) |
| random.randn | 生成指定的的隨機數(shù)組 |
5.ndarray的數(shù)據(jù)類型
? ?數(shù)據(jù)類型dtype,包含了ndarray需要為某一類型數(shù)據(jù)所申明的內(nèi)存塊信息與數(shù)據(jù)的邏輯結(jié)構(gòu)與物理結(jié)構(gòu),是結(jié)構(gòu)類型的數(shù)據(jù)類型,又稱為元數(shù)據(jù)(表示數(shù)據(jù)的數(shù)據(jù))。
? ?和其它語言的數(shù)據(jù)類型一樣,可以用
astype方法
顯式地轉(zhuǎn)換數(shù)組的數(shù)據(jù)類型。注意在參數(shù)傳遞時盡量要加上np,這里要注意的是
使用numpy.string_類型作字符串數(shù)據(jù)要小心,因為NumPy會修正它的大小或刪除輸入且不發(fā)出警告
,如果轉(zhuǎn)換類型出錯會出現(xiàn)ValueError異常。
? ?這里要注意,用
astype
轉(zhuǎn)換類型時是生成一個新數(shù)組,也就是元數(shù)組的拷貝。
6.NumPy數(shù)組算術(shù)
(1)向量化
? ?數(shù)組可以用標量的操作語法進行批量操作而無須用for循環(huán),稱之為向量化。
(2)相同尺寸數(shù)組算術(shù)操作
? ?相同尺寸數(shù)組算術(shù)操作應(yīng)用了逐元素操作的方式。如果帶有標量的操作語法,都是這樣的。
? ?同尺寸數(shù)組之間比較,會產(chǎn)生一個布爾值數(shù)組。
(3)不同尺寸數(shù)組算術(shù)操作
? ?不同尺寸數(shù)組算術(shù)操作用到了廣播特性,在后面講解時,會詳細講到。
7.ndarray數(shù)組索引與切片
(1)基礎(chǔ)索引切片以及與序列的不同
對于一維數(shù)組,和序列的索引切片方法一樣:
? ?這里要注意,數(shù)組的切片是原數(shù)組的視圖,和列表等序列有區(qū)別,它并不是被復(fù)制了,任何對數(shù)組的修改都會反映到原數(shù)組中:
下面用列表進行比較:
? ?這里是由于如果數(shù)組的切片是復(fù)制的話,對于大數(shù)據(jù)處理的話就會引起內(nèi)存問題。
(2)數(shù)組拷貝
? ?如果只想得到一份數(shù)組切片的拷貝的話,就需要用到copy()函數(shù)。
(3)多維數(shù)組拷貝
? ?對于多維數(shù)組,每個索引值獲得的數(shù)據(jù)是下一層數(shù)組或者元素。可以用[,]代替[][]等,如下:
? ?這里要注意的是,對于一個數(shù)組的索引和切片,返回的都是數(shù)組的視圖,對其修改會體現(xiàn)到原視圖上。
? ?可以配合索引和切片使用,就可以得到低緯度的切片。
? ?比如
list[a:b,c:d]
,就是選擇第a->b-1行,列為c->d-1的數(shù)據(jù),如下:
選擇前兩行,第三列的數(shù)據(jù):
? ?最好的方法就是先把其進行排列,排成二維表等,這里由于最常用的是二維數(shù)組,就先用二維數(shù)組進行說明。
(4)布爾索引
假設(shè)我們的數(shù)據(jù)都在數(shù)組中,如下一個數(shù)組:
? ?我們的數(shù)組的比較操作也是可以向量化的,會生成一個布爾值數(shù)組。例如我們用(==)生成一個布爾值數(shù)組:
這時候,我們索引某個數(shù)組的時候,就可以用到這個布爾值數(shù)組了
,例如我們先創(chuàng)建一個隨機數(shù)組:
? ?然后用布爾值數(shù)組進行索引:
? ?這里要注意的是,布爾值數(shù)組的長度要和要索引的數(shù)組的第一維長度相同。當不正確時,會報錯:
? ?還可以在索引值后面加上一個整數(shù)或切片,找到下一維對應(yīng)的值:
? ?還可以用!=或者~對布爾索引條件取反,表示選擇找到布爾索引對應(yīng)的行:
? ?還可以對多個布爾值條件進行聯(lián)合,要用到數(shù)學操作&(and)和|(or),選擇多條件:
? ?在這里,
使用布爾值索引選擇數(shù)據(jù)時,是生成數(shù)組的拷貝,即使返回的數(shù)組并沒有任何變化
,這個和Python的內(nèi)置數(shù)據(jù)類型一樣。
(5)神奇索引
先創(chuàng)建一個數(shù)組:
? ?可以在索引時,簡單地傳遞一個包含指明所需順序的整數(shù)的列表或數(shù)組,如果是負整數(shù)索引,將從尾部進行選擇:
這里要注意,索引是元組的話,選擇的是指定數(shù)據(jù)
? ?傳遞多個索引數(shù)組時,會根據(jù)每個索引到的元組對應(yīng)的元素選出一個n維數(shù)組(看選取到了哪一級別),傳了多少,就是幾維。
? ?比如有一個三維數(shù)組:
我們進行選擇:
? ?我們可以通過下面的方法,截取到我們想要的矩形區(qū)域:
在第二維及之后用到":":
上面的索引選擇都可以重新復(fù)制,這里要注意的是,索引是復(fù)制了一份新的數(shù)組,而切片是原數(shù)組的視圖,對切片的修改都會體現(xiàn)到原數(shù)組。
8.數(shù)組轉(zhuǎn)置和換軸
? ?數(shù)組轉(zhuǎn)置會將二數(shù)組的行與列進行翻轉(zhuǎn),對于多維數(shù)組,會指定軸進行轉(zhuǎn)換。在NumPy中,數(shù)軸轉(zhuǎn)置與換軸有下面三種方式,他前兩個返回的是數(shù)組的復(fù)制,最后一個返回的是數(shù)組的視圖,對視圖的修改會反映到原數(shù)組:
(1).T屬性,適用于一,二維數(shù)組,如下:
(2)transpose高維數(shù)組轉(zhuǎn)置
? ?對于高維數(shù)組,transpose需要用到一個由軸編號組成的元組,這個就比較難理解。這里就是先看是多少維數(shù)組,然后從0開始編號。
? ?如下,我們先創(chuàng)建一個三維數(shù)組,:
然后使用transpose函數(shù):
就可以按照參數(shù)元組的規(guī)則,比如8原來的索引與現(xiàn)在的索引對比:
(3)swapaxes對換軸
? ?可以用shape屬性查看數(shù)組的每一維的個數(shù),用swapaxes函數(shù)對索引對應(yīng)的不同的兩個維數(shù)的數(shù)據(jù)進行對換。如果是0和1對換,就相當于轉(zhuǎn)置。如下:
? ?這里要注意的是,swpaxes返回的是數(shù)據(jù)的視圖,不是對數(shù)據(jù)的復(fù)制。
四:通用函數(shù)
? ?通用函數(shù)是在數(shù)組中逐元素操作的函數(shù),把一些標量函數(shù)進行向量化封裝,應(yīng)用到每一個元素中。
? ?和Python的內(nèi)建數(shù)據(jù)類型的方法沒什么區(qū)別,只是作用于每一個元素了,就是
數(shù)組的函數(shù)
。
這里只介紹一些常用的函數(shù):
一元數(shù)組的通用函數(shù)有:
| 函數(shù)名 | 描述 |
|---|---|
| sqrt | 計算每個元素的平方根(與array ** 0.5相等) |
| exp | 計算每個元素的自然指數(shù)值 |
二元數(shù)組的通用函數(shù)有:
| 函數(shù)名 | 描述 |
|---|---|
| add | 講兩個數(shù)組的值進行相加,并返回一個數(shù)組作為結(jié)果,其他常見的操作函數(shù)這里省略 |
| maxium | 比較兩個元素的最大值,并返回一個數(shù)組作為結(jié)果,不忽略NaN |
| fmax | 比較兩個元素的最大值,并返回一個數(shù)組作為結(jié)果,忽略NaN |
| minium | 比較兩個元素的最小值,并返回一個數(shù)組作為結(jié)果,不忽略NaN |
| fmin | 比較兩個元素的最小值,并返回一個數(shù)組作為結(jié)果,忽略NaN |
? ?上面的通用函數(shù)返回的都是一個數(shù)組,還有一些函數(shù),返回的是多個數(shù)組。如modf,他返回了一個數(shù)組的小數(shù)和整數(shù)部分。如下:
五:數(shù)組向量化的一些方法
? ?使用NumPy數(shù)組可以利用
簡單的數(shù)組表達式
(函數(shù)參數(shù),索引切片等)完成多種數(shù)據(jù)操作任務(wù),而無須用大量循環(huán)。這種用
數(shù)組表達式
替代顯式循環(huán)的方法稱之為向量化。
下面就介紹一些數(shù)組向量化的方法。
1.條件邏輯
? ?numpy.where是三元表達式x if a else b的向量化版本。它可以把一些條件選擇的語句變得范圍更廣些,對于大數(shù)據(jù)來說,速度會快很多,而且適用于多維數(shù)組。
np.where有兩種用法:
? ?第一種是np.where(condition, x, y),即滿足條件(condition),輸出x,不滿足輸出y。這里0相當于False,1相當于True。
? ?第二種是np.where(condition),只有條件 (condition),沒有x和y,則輸出滿足條件 (即非0) 元素的坐標 這里的坐標以tuple的形式給出,通常原數(shù)組有多少維,輸出的tuple中就包含幾個數(shù)組,分別對應(yīng)符合條件元素的各維坐標。這里的坐標就是從0開始的索引。
注:傳遞給np.where的數(shù)組既可以是同等大小的數(shù)組,也可以是標量。
2.數(shù)組和統(tǒng)計方法
? ?在NumPy中,有許多計算整個數(shù)組統(tǒng)計值或關(guān)于某個軸的數(shù)據(jù)的函數(shù)。有兩種寫法,一種是直接調(diào)用數(shù)組實例的方法,一種是使用頂層的NumPy函數(shù)。
假設(shè)arr是某個數(shù)組,
? ?第一種寫法是:arr.function(),這里的function()為某個函數(shù);
? ?第二種寫法是:np.function(arr),這里的function()為某個函數(shù)。
? ?這些函數(shù)有的還可以接受一個可選參數(shù)axis,用于計算給定軸向上的統(tǒng)計值,形成一個下降一維的數(shù)組,可以省略axis,下面是一些方法:
| 方法 | 描述 |
|---|---|
| sum | 沿著某個軸計算所有元素的累和,空數(shù)組,累和為0 |
| mean | 數(shù)學平均,空數(shù)組,平均值為NaN |
| std,var | 標準差和方差,可以選擇自由度調(diào)整(默認分母為n) |
| min,max | 最大值和最小值 |
| argmin,argmax | 最大值和最小值的位置 |
| cumsum | 從0開始元素累積和 |
| cumprod | 從1開始元素累積和 |
3.布爾值數(shù)組的方法
? ?對于布爾值數(shù)組,有兩個十分有用的方法,一個是any,一個是all。any檢查數(shù)組中是否至少有一個True,而all檢查數(shù)組中是否每個值是True,這些方法對于其他非布爾類型數(shù)組也有用。
我們先用==生成一個布爾值數(shù)組:
然后用這些函數(shù):
4.排序
? ?用
sort方法
進行NumPy數(shù)組排序,返回的是已經(jīng)排序好的數(shù)組的拷貝。
5.一維數(shù)組基礎(chǔ)集合操作
? ?NumPy中包含了一些針對一維數(shù)組的基礎(chǔ)集合操作,如下:
| 方法 | 描述 |
|---|---|
| unique(x) | 計算x的唯一值,并排序,得到的是拷貝 |
| intersectld(x,y) | 計算x和y的交集,并排序 |
| union1d(x,y) | 計算x和y的并集,并排序 |
| inld(x,y) | 計算x中的元素是否包含在y中,返回一個布爾值數(shù)組 |
| setdiffld(x,y) | 差集,在x中但不在y中的x的元素 |
| setxorld(x,y) | 異或集,在x或y中,但不屬于x,y交集的元素 |
6.使用數(shù)組進行文件輸入和輸出
? ?在NumPy中,可以將數(shù)據(jù)以文本或二進制文件的形式存入硬盤或由硬盤載入。這里只展示NumPy內(nèi)建二進制格式,由于大部分用戶更喜歡用其他的工具載入文本或表格型數(shù)據(jù)。
? ?np.save和np.load是高效存取硬盤數(shù)據(jù)的兩個工具函數(shù),數(shù)組在默認情況下是以壓縮的格式進行存儲的,后綴名為.npy,保存的都是二進制格式。
? ?如果沒有寫.npy,則會被自動加上。可以用.load載入數(shù)據(jù)。
如下:
存入數(shù)據(jù):
讀取數(shù)據(jù):
genfromtxt()函數(shù)可以從文本中讀取數(shù)據(jù)并將其插入數(shù)組中,這個函數(shù)接收三個參數(shù):存放數(shù)據(jù)的文件名、用于分隔值的字符和是否含有列標題。
這是NumPy的一些基本操作,之后會介紹更高級的操作。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

