Python之Numpy的超實(shí)用基礎(chǔ)詳細(xì)教程
Numpy在python中屬于非常常用的包,無(wú)論是機(jī)器學(xué)習(xí)搭配pandas,還是數(shù)據(jù)可視化搭配pylab都是很正常的搭配。
Numpy
numpy的官方中文文檔:NumPy 中文
NumPy是使用Python進(jìn)行科學(xué)計(jì)算的基礎(chǔ)軟件包。除其他外,它包括:
- 功能強(qiáng)大的N維數(shù)組對(duì)象;
- 精密廣播功能函數(shù);
- 集成C/C+和Fortran代碼的工具;
- 強(qiáng)大的線性代數(shù)、傅立葉變換和隨機(jī)數(shù)功能。
更簡(jiǎn)單的說(shuō),Numpy是Python的Matlab數(shù)學(xué)計(jì)算包。使用它,python可以更簡(jiǎn)單便捷地對(duì)矩陣向量進(jìn)行計(jì)算。
一般來(lái)說(shuō),我們引用該包并將其簡(jiǎn)稱(chēng)為np:
import numpy as np
Numpy的ndarry對(duì)象
ndarray的創(chuàng)建
Numpy中最重要的數(shù)據(jù)類(lèi)型就是:N維數(shù)組對(duì)象ndarray。它是一系列同類(lèi)型數(shù)據(jù)的集合,以0下標(biāo)為開(kāi)始進(jìn)行集合中元素的索引。
它具有以下兩個(gè)特點(diǎn):
- ndarray對(duì)象是用于存放同類(lèi)型元素的多維數(shù)組;
- ndarray中的每個(gè)元素在內(nèi)存中都有相同存儲(chǔ)大小的區(qū)域。
創(chuàng)建一個(gè)ndarray對(duì)象:
np.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
參數(shù)說(shuō)明:
名稱(chēng) | 描述 |
---|---|
object | 數(shù)組或嵌套的數(shù)列 |
dtype | 數(shù)組元素的數(shù)據(jù)類(lèi)型,可選 |
copy | 對(duì)象是否需要復(fù)制,可選 |
order | 創(chuàng)建數(shù)組的樣式,C為行方向,F(xiàn)為列方向,A為任意方向(默認(rèn)) |
subok | 默認(rèn)返回一個(gè)與基類(lèi)類(lèi)型一致的數(shù)組 |
ndmin | 指定生成數(shù)組的最小維度 |
一般而言,并不需要記住這么多可選參數(shù):
import numpy as np if __name__ == "__main__": x = np.array([1, 2, 3]) print(x)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[1 2 3]
當(dāng)然,除了之前的array方法創(chuàng)建ndarray對(duì)象之外,還提供了另外的幾種創(chuàng)建方式:
np.empty(shape, dtype = float, order = 'C') # 指定形狀的未初始化數(shù)組 np.zeros(shape, dtype = float, order = 'C') # 指定形狀的全0數(shù)組 np.ones(shape, dtype = None, order = 'C') # 指定形狀的全1數(shù)組 np.arange(start = 0, stop, step = 1, dtype) # 從起始值到終止值(不包含)時(shí),按步長(zhǎng)從范圍內(nèi)創(chuàng)建數(shù)組 np.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None) # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個(gè)等差數(shù)組的一維數(shù)組 np.logspace(start, stop, num = 50, endpoint = True, base = 10.0, dtype = None) # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個(gè)等比數(shù)組的一維數(shù)組
Numpy也提供了從python其他類(lèi)型直接轉(zhuǎn)換成ndarray的方式:
np.asarray(a, dtype = None, order = None) # 列表形式 np.frombuffer(buffer, dtype = float, count = -1, offset = 0) # 以流的形式讀入 np.fromiter(iterable, dtype, count=-1) # 從可迭代對(duì)象中,以迭代器的形式讀入
例如:
import numpy as np if __name__ == "__main__": a = [[1, 2 ,3], [4, 5]] b = 'Hello World' c = iter(range(5)) x = np.asarray(a) y = np.frombuffer(b, dtype = 'S1') z = np.fromiter(c, dtype = float) print(x) print(y) print(z)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[list([1, 2, 3]) list([4, 5])]
['H' 'e' 'l' 'l' 'o' ' ' 'W' 'o' 'r' 'l' 'd']
[0. 1. 2. 3. 4.]
ndarray的數(shù)據(jù)結(jié)構(gòu)
Numpy支持很多的數(shù)據(jù)類(lèi)型,下面就簡(jiǎn)單地列舉一下:
名稱(chēng) | 描述 |
---|---|
bool_ | 布爾型數(shù)據(jù)類(lèi)型(True或者False) |
int_/int8/int16/int32/int64 | 有符號(hào)整數(shù) |
uint8/uint16/uint32/uint64 | 無(wú)符號(hào)整數(shù) |
float_/float16/float32/float64 | 浮點(diǎn)數(shù) |
complex_/complex64/complex128 | 復(fù)數(shù) |
但如果是自定義的數(shù)據(jù)類(lèi)型,就需要通過(guò)dtype來(lái)確定了:
numpy.dtype(object, align, copy)
參數(shù)說(shuō)明:
名稱(chēng) | 描述 |
---|---|
object | 要轉(zhuǎn)換為的數(shù)據(jù)類(lèi)型對(duì)象 |
align | 如果為true,填充字段使其類(lèi)似C的結(jié)構(gòu)體 |
copy | 復(fù)制dtype對(duì)象 ,如果為false,則是對(duì)內(nèi)置數(shù)據(jù)類(lèi)型對(duì)象的引用 |
例如,可以創(chuàng)建一個(gè)student的對(duì)象:
import numpy as np if __name__ == "__main__": student = np.dtype([('name', 'S20'), ('age', 'i8'), ('score', 'f4')]) a = np.array([('zhangsan', 18, 80), ('lisi', 19, 85)], dtype=student) print(a)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[('zhangsan', 18, 80.) ('lisi', 19, 85.)]
ndarray的屬性
ndarray有兩個(gè)非常常用的屬性,shape和size。shape表示數(shù)組的維度,對(duì)于二維數(shù)組而言,就是其行數(shù)和列數(shù);size表示數(shù)組元素的總個(gè)數(shù),對(duì)于二維數(shù)組而言,就是行數(shù)與列數(shù)的相乘。
例如:
import numpy as np if __name__ == "__main__": a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape) print(a.size)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
(2, 3)
6
當(dāng)然,ndarray對(duì)象提供了兩種方式在不改變數(shù)據(jù)內(nèi)容的情況下,改變一個(gè)數(shù)組的格式。但兩種方式有所區(qū)別:
import numpy as np if __name__ == "__main__": a = np.array([[1, 2, 3], [4, 5, 6]]) a.shape = (3, 2) # 直接改變本體 print(a) b = a.reshape(2, 3) # 本體不改變,將改變后的對(duì)象返回 print(b)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[1 2]
[3 4]
[5 6]]
[[1 2 3]
[4 5 6]]
ndarray的內(nèi)容訪問(wèn)
ndarray對(duì)象的內(nèi)容可以通過(guò)索引或切片來(lái)訪問(wèn)和修改,與python中l(wèi)ist的切片操作一樣。
ndarray既可以基于下標(biāo)進(jìn)行切片,也可以通過(guò)內(nèi)置的slice函數(shù),并設(shè)置start,stop及step參數(shù)進(jìn)行,從原數(shù)組中切割出一個(gè)新數(shù)組。
例如:
import numpy as np if __name__ == "__main__": a = np.arange(10) b = a[1:7:1] s = slice(1,7,1) c = a[s] print(a) print(b) print(c)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[0 1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6]
[1 2 3 4 5 6]
對(duì)于冒號(hào):的解釋?zhuān)?/p>
- 如果是一維數(shù)組,如果只放置一個(gè)參數(shù),如[2],將返回與該索引相對(duì)應(yīng)的單個(gè)元素。如果為[2:],表示從該索引開(kāi)始以后的所有項(xiàng)都將被提取。如果使用了兩個(gè)參數(shù),如[2:7],那么則提取兩個(gè)索引(不包括停止索引)之間的項(xiàng);
- 如果是多維數(shù)組,使用,區(qū)分維數(shù)。
例如:
import numpy as np if __name__ == "__main__": a = np.arange(25) a.shape = (5, 5) b = a[1:4, 2:4] print(a) print(b)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
[[ 7 8]
[12 13]
[17 18]]
ndarray除了基于下標(biāo)進(jìn)行切片,還有一些高級(jí)索引方式,比如布爾索引、花式索引。
例如:
import numpy as np if __name__ == "__main__": a = np.arange(25) a.shape = (5, 5) b = a[a > 6] c = a[[3, 2, 4]] print(a) print(b) print(c)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
[ 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]
[[15 16 17 18 19]
[10 11 12 13 14]
[20 21 22 23 24]]
其他
判斷元素對(duì)象是都為NaN:
np.isnan(...)
Numpy的廣播
如果兩個(gè)ndarray:a和b形狀相同,即滿(mǎn)足a.shape==b.shape,那么a與b的算數(shù)結(jié)果就是a與b數(shù)組對(duì)應(yīng)位做算術(shù)運(yùn)算。這要求維數(shù)相同,且各維度的長(zhǎng)度相同。
例如:
import numpy as np if __name__ == "__main__": a = np.array([1, 2, 3]) b = np.array([1, 2, 3]) c = a + b d = a * b print(c) print(d)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[2 4 6]
[1 4 9]
而,廣播是Numpy對(duì)不同形狀(shape)的ndarray進(jìn)行數(shù)值計(jì)算的方式,對(duì)ndarray的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行
。
怎么才算是相應(yīng)的元素呢?
雖然,廣播是對(duì)不同形狀(shape)而言,但其實(shí)還是要滿(mǎn)足兩個(gè)條件:列數(shù)相同,有一個(gè)行數(shù)為1。在這個(gè)前提下,每行的相同列的元素就是相對(duì)應(yīng)的元素。
直接看文字可能還是有點(diǎn)不太能理解,可以看一下例子:
import numpy as np if __name__ == "__main__": a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = np.array([1, 2, 3]) c = a + b d = a * b print(c) print(d)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[ 2 4 6]
[ 5 7 9]
[ 8 10 12]]
[[ 1 4 9]
[ 4 10 18]
[ 7 16 27]]
所謂廣播就是:當(dāng)列數(shù)相同的時(shí)候,行數(shù)為1的ndarray會(huì)進(jìn)行擴(kuò)行的操作,增加的行數(shù)內(nèi)容與原行的內(nèi)容相同。
擴(kuò)行的實(shí)現(xiàn)可以通過(guò)tile函數(shù)實(shí)現(xiàn):
np.tile(obj, (行, 列)) # 在行上和列上分別重復(fù)一定的次數(shù)
所以,上文的廣播也可以通過(guò)下面的方式來(lái)代替:
import numpy as np if __name__ == "__main__": a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = np.array([1, 2, 3]) bb = np.tile(b, (3, 1)) c = a + bb d = a * bb print(bb) print(c) print(d)
運(yùn)行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[1 2 3]
[1 2 3]
[1 2 3]]
[[ 2 4 6]
[ 5 7 9]
[ 8 10 12]]
[[ 1 4 9]
[ 4 10 18]
[ 7 16 27]]
ndarray的函數(shù)
ndarray提供了很多的數(shù)學(xué)函數(shù)、算術(shù)函數(shù)、排序函數(shù),以便進(jìn)行運(yùn)算。
ndarray的數(shù)學(xué)函數(shù),例如:
np.pi # 圓周率 np.sin(obj) # 三角運(yùn)算 np.cos(obj) np.tan(obj) np.arcsin(obj) # 反三角運(yùn)算 np.arccos(obj) np.arctan(obj) np.degrees(obj) # 將弧度值轉(zhuǎn)換為角度值 np.around(obj, decimals) # 返回ndarray每個(gè)元素的四舍五入值,decimals為舍入的小數(shù)位數(shù),默認(rèn)為0 np.floor(obj) # 向下取整 np.ceil(obj) # 向上取整
ndarray的算術(shù)函數(shù),例如:
np.add(obj1, obj2) # 加減乘除運(yùn)算,與+-*/效果一致,需要符合廣播原則 np.subtract(obj1, obj2) np.multiply(obj1, obj2) np.divide(obj1, obj2) np.mod(obj1, obj2) # 求余數(shù)運(yùn)算 np.reciprocal(obj) # 元素取倒數(shù) np.power(obj1, obj2) # 計(jì)算前參數(shù)為底,后參數(shù)為冪的值
ndarray的排序函數(shù),例如:
np.sort(obj, axis=1, kind='quicksort', order)
參數(shù)說(shuō)明:
名稱(chēng) | 描述 |
---|---|
obj | 數(shù)組或嵌套的數(shù)列 |
axis | axis=0按列排序,axis=1按行排序 |
kind | ‘quicksort'、‘mergesort'、‘heapsort' |
order | 如果數(shù)組包含字段,則是要排序的字段 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python Web框架Flask中使用新浪SAE云存儲(chǔ)實(shí)例
這篇文章主要介紹了Python Web框架Flask中使用新浪SAE云存儲(chǔ)實(shí)例,本文是對(duì)SAE云存儲(chǔ)的簡(jiǎn)單封裝,需要的朋友可以參考下2015-02-02python+opencv邊緣提取與各函數(shù)參數(shù)解析
這篇文章主要介紹了python+opencv邊緣提取與各函數(shù)參數(shù)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python實(shí)現(xiàn)批量采集商品數(shù)據(jù)的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量采集商品的數(shù)據(jù),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Matplotlib實(shí)戰(zhàn)之直方圖繪制詳解
直方圖,又稱(chēng)質(zhì)量分布圖,用于表示數(shù)據(jù)的分布情況,是一種常見(jiàn)的統(tǒng)計(jì)圖表,這篇文章主要為大家詳細(xì)介紹了如何使用Matplotlib繪制直方圖,需要的可以參考下2023-08-08Python網(wǎng)絡(luò)爬蟲(chóng)的基本原理解析
如果要獲取網(wǎng)絡(luò)上數(shù)據(jù),我們要給爬蟲(chóng)一個(gè)網(wǎng)址(程序中通常叫URL),爬蟲(chóng)發(fā)送一個(gè)HTTP請(qǐng)求給目標(biāo)網(wǎng)頁(yè)的服務(wù)器,服務(wù)器返回?cái)?shù)據(jù)給客戶(hù)端(也就是我們的爬蟲(chóng)),爬蟲(chóng)再進(jìn)行數(shù)據(jù)解析、保存等一系列操作,需要的朋友可以參考下2023-05-05pandas分組聚合(agg,transform,apply)
在SQL中我們經(jīng)常使用 GROUP BY 將某個(gè)字段,按不同的取值進(jìn)行分組, 在pandas中也有g(shù)roupby函數(shù),本文主要介紹了pandas分組聚合(agg,transform,apply),具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法
這篇文章主要介紹了Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05詳解Python實(shí)現(xiàn)字典合并的四種方法
這篇文章主要為大家詳細(xì)介紹了Python的合并字典的四種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03