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

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
