您好,登錄后才能下訂單哦!
Numpy在python中屬于非常常用的包,無論是機(jī)器學(xué)習(xí)搭配pandas,還是數(shù)據(jù)可視化搭配pylab都是很正常的搭配。
Numpy
numpy的官方中文文檔:NumPy 中文
NumPy是使用Python進(jìn)行科學(xué)計算的基礎(chǔ)軟件包。除其他外,它包括:
更簡單的說,Numpy是Python的Matlab數(shù)學(xué)計算包。使用它,python可以更簡單便捷地對矩陣向量進(jìn)行計算。
一般來說,我們引用該包并將其簡稱為np:
import numpy as np
Numpy的ndarry對象
ndarray的創(chuàng)建
Numpy中最重要的數(shù)據(jù)類型就是:N維數(shù)組對象ndarray。它是一系列同類型數(shù)據(jù)的集合,以0下標(biāo)為開始進(jìn)行集合中元素的索引。
它具有以下兩個特點:
創(chuàng)建一個ndarray對象:
np.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
參數(shù)說明:
名稱 | 描述 |
---|---|
object | 數(shù)組或嵌套的數(shù)列 |
dtype | 數(shù)組元素的數(shù)據(jù)類型,可選 |
copy | 對象是否需要復(fù)制,可選 |
order | 創(chuàng)建數(shù)組的樣式,C為行方向,F(xiàn)為列方向,A為任意方向(默認(rèn)) |
subok | 默認(rèn)返回一個與基類類型一致的數(shù)組 |
ndmin | 指定生成數(shù)組的最小維度 |
一般而言,并不需要記住這么多可選參數(shù):
import numpy as np if __name__ == "__main__": x = np.array([1, 2, 3]) print(x)
運行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[1 2 3]
當(dāng)然,除了之前的array方法創(chuàng)建ndarray對象之外,還提供了另外的幾種創(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) # 從起始值到終止值(不包含)時,按步長從范圍內(nèi)創(chuàng)建數(shù)組 np.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None) # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個等差數(shù)組的一維數(shù)組 np.logspace(start, stop, num = 50, endpoint = True, base = 10.0, dtype = None) # 從起始值到終止值(默認(rèn)包含)創(chuàng)建一個等比數(shù)組的一維數(shù)組
Numpy也提供了從python其他類型直接轉(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) # 從可迭代對象中,以迭代器的形式讀入
例如:
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)
運行該腳本:
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ù)類型,下面就簡單地列舉一下:
名稱 | 描述 |
---|---|
bool_ | 布爾型數(shù)據(jù)類型(True或者False) |
int_/int8/int16/int32/int64 | 有符號整數(shù) |
uint8/uint16/uint32/uint64 | 無符號整數(shù) |
float_/float16/float32/float64 | 浮點數(shù) |
complex_/complex64/complex128 | 復(fù)數(shù) |
但如果是自定義的數(shù)據(jù)類型,就需要通過dtype來確定了:
numpy.dtype(object, align, copy)
參數(shù)說明:
名稱 | 描述 |
---|---|
object | 要轉(zhuǎn)換為的數(shù)據(jù)類型對象 |
align | 如果為true,填充字段使其類似C的結(jié)構(gòu)體 |
copy | 復(fù)制dtype對象 ,如果為false,則是對內(nèi)置數(shù)據(jù)類型對象的引用 |
例如,可以創(chuàng)建一個student的對象:
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)
運行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[('zhangsan', 18, 80.) ('lisi', 19, 85.)]
ndarray的屬性
ndarray有兩個非常常用的屬性,shape和size。shape表示數(shù)組的維度,對于二維數(shù)組而言,就是其行數(shù)和列數(shù);size表示數(shù)組元素的總個數(shù),對于二維數(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)
運行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
(2, 3)
6
當(dāng)然,ndarray對象提供了兩種方式在不改變數(shù)據(jù)內(nèi)容的情況下,改變一個數(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) # 本體不改變,將改變后的對象返回 print(b)
運行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[[1 2]
[3 4]
[5 6]]
[[1 2 3]
[4 5 6]]
ndarray的內(nèi)容訪問
ndarray對象的內(nèi)容可以通過索引或切片來訪問和修改,與python中l(wèi)ist的切片操作一樣。
ndarray既可以基于下標(biāo)進(jìn)行切片,也可以通過內(nèi)置的slice函數(shù),并設(shè)置start,stop及step參數(shù)進(jìn)行,從原數(shù)組中切割出一個新數(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)
運行該腳本:
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]
對于冒號:的解釋:
例如:
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)
運行該腳本:
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)行切片,還有一些高級索引方式,比如布爾索引、花式索引。
例如:
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)
運行該腳本:
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]]
其他
判斷元素對象是都為NaN:
np.isnan(...)
Numpy的廣播
如果兩個ndarray:a和b形狀相同,即滿足a.shape==b.shape,那么a與b的算數(shù)結(jié)果就是a與b數(shù)組對應(yīng)位做算術(shù)運算。這要求維數(shù)相同,且各維度的長度相同。
例如:
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)
運行該腳本:
yngzmiao@yngzmiao-virtual-machine:~/test$ python numpy_test.py
[2 4 6]
[1 4 9]
而,廣播是Numpy對不同形狀(shape)的ndarray進(jìn)行數(shù)值計算的方式,對ndarray的算術(shù)運算通常在相應(yīng)的元素上進(jìn)行
。
怎么才算是相應(yīng)的元素呢?
雖然,廣播是對不同形狀(shape)而言,但其實還是要滿足兩個條件:列數(shù)相同,有一個行數(shù)為1。在這個前提下,每行的相同列的元素就是相對應(yīng)的元素。
直接看文字可能還是有點不太能理解,可以看一下例子:
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)
運行該腳本:
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ù)為1的ndarray會進(jìn)行擴(kuò)行的操作,增加的行數(shù)內(nèi)容與原行的內(nèi)容相同。
擴(kuò)行的實現(xiàn)可以通過tile函數(shù)實現(xiàn):
np.tile(obj, (行, 列)) # 在行上和列上分別重復(fù)一定的次數(shù)
所以,上文的廣播也可以通過下面的方式來代替:
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)
運行該腳本:
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)行運算。
ndarray的數(shù)學(xué)函數(shù),例如:
np.pi # 圓周率 np.sin(obj) # 三角運算 np.cos(obj) np.tan(obj) np.arcsin(obj) # 反三角運算 np.arccos(obj) np.arctan(obj) np.degrees(obj) # 將弧度值轉(zhuǎn)換為角度值 np.around(obj, decimals) # 返回ndarray每個元素的四舍五入值,decimals為舍入的小數(shù)位數(shù),默認(rèn)為0 np.floor(obj) # 向下取整 np.ceil(obj) # 向上取整
ndarray的算術(shù)函數(shù),例如:
np.add(obj1, obj2) # 加減乘除運算,與+-*/效果一致,需要符合廣播原則 np.subtract(obj1, obj2) np.multiply(obj1, obj2) np.divide(obj1, obj2) np.mod(obj1, obj2) # 求余數(shù)運算 np.reciprocal(obj) # 元素取倒數(shù) np.power(obj1, obj2) # 計算前參數(shù)為底,后參數(shù)為冪的值
ndarray的排序函數(shù),例如:
np.sort(obj, axis=1, kind='quicksort', order)
參數(shù)說明:
名稱 | 描述 |
---|---|
obj | 數(shù)組或嵌套的數(shù)列 |
axis | axis=0按列排序,axis=1按行排序 |
kind | ‘quicksort'、‘mergesort'、‘heapsort' |
order | 如果數(shù)組包含字段,則是要排序的字段 |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。