Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)
參考: https://gitbook.cn/gitchat/column/undefined/topic/5e3bceadec8d9033cf924665
打開(kāi) IPython ,創(chuàng)建 Python 的列表 a 對(duì)象。然后,使用列表生成式,創(chuàng)建一個(gè)元素都為原來(lái)兩倍的新列表 a2,并統(tǒng)計(jì)這一行的用時(shí)為 921 ms。
In [95]: a =list(range(10000000))In [96]: %time b = [i*2 for i in a]
Wall time: 921 ms
使用 NumPy ,創(chuàng)建同樣大小和取值的數(shù)組 na。然后,對(duì)每個(gè)元素乘以 2,返回一個(gè)新數(shù)組 na2,用時(shí)為 31 ms。
In [90]: import numpy as npIn [93]: na = np.array(range(10000000))In [94]: %time na = na*2
Wall time: 31.3 ms
可以看到,完成同樣的都對(duì)元素乘以 2 的操作, NumPy 比 Python 快了 30 倍之多。
NumPy 計(jì)算為什么這么快呢?
Python的list是一個(gè)通用結(jié)構(gòu)。它能包括任意類(lèi)型的對(duì)象,并且是動(dòng)態(tài)類(lèi)型。NumPy的ndarray是靜態(tài)、同質(zhì)的類(lèi)型,當(dāng)ndarray對(duì)象被創(chuàng)建時(shí),元素的類(lèi)型就確定。
由于是靜態(tài)類(lèi)型,所以 ndarray 間的加、減、乘、除用 C 和 Fortran 實(shí)現(xiàn)才成為可能,所以運(yùn)行起來(lái)就會(huì)更快。根據(jù)官網(wǎng)介紹,底層代碼用 C 語(yǔ)言和 Fortran 語(yǔ)言實(shí)現(xiàn),實(shí)現(xiàn)性能無(wú)限接近 C 的處理效率。
1. 創(chuàng)建 Numpy 數(shù)組
1.1 一維數(shù)組 array
In [99]: import numpy as npIn [101]: np.array([1,2,3,4])
Out[101]: array([1, 2, 3, 4])
1.2 二維數(shù)組 array
In [102]: np.array([[1,2], [3,4]])
Out[102]:
array([[1, 2],[3, 4]])
一維數(shù)組和二維數(shù)組的類(lèi)型都為 numpy.ndarray
In [103]: a = np.array([1,2,3,4])In [104]: b = np.array([[1,2], [3,4]])In [105]: type(a)
Out[105]: numpy.ndarrayIn [106]: type(b)
Out[106]: numpy.ndarray
1.3 arange 數(shù)組
In [22]: r = np.arange(1, 10, 1)In [23]: r
Out[23]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
arange() 的第一個(gè)值代表開(kāi)始值,第二個(gè)值代表終值(不包括這個(gè)值),最后一個(gè)值代表步長(zhǎng)(間隔),如 arange(1,10,1) 代表一個(gè)從 0-9,步長(zhǎng)為 1 的數(shù)組。
1.4 linspace 數(shù)組
返回 1 和 10 之間的 8 個(gè)元素。
In [110]: np.linspace(1, 10, 8)
Out[110]:
array([ 1. , 2.28571429, 3.57142857, 4.85714286, 6.14285714,7.42857143, 8.71428571, 10. ])In [111]: np.linspace(1, 10, 8)
Out[111]:
array([ 1. , 2.28571429, 3.57142857, 4.85714286, 6.14285714,7.42857143, 8.71428571, 10. ])In [112]:
對(duì)于 linspace() ,它的前兩個(gè)值和 arange() 一樣,代表開(kāi)始值和終值,但有個(gè)區(qū)別是 linspace() 默認(rèn)包括終值,如果你不想包括終值,加上 endpoint = False 即可,對(duì)于第三個(gè)值它是指元素的個(gè)數(shù),這個(gè)和 arange 不一樣,一定不要混淆。
1.5 組合 ndarray 對(duì)象
如下創(chuàng)建一個(gè) ndarray 對(duì)象 a :
In [112]: a = np.arange(10).reshape(2, -1)In [113]: a
Out[113]:
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])
找出 a 中大于 4 的元素索引,使用 where 方法,返回一個(gè)元組,帶有 2 個(gè) ndarray 對(duì)象,分別表示大于 4 的元素第一維、第二維度中的位置:
In [114]: np.where(a>4)
Out[114]: (array([1, 1, 1, 1, 1], dtype=int64), array([0, 1, 2, 3, 4], dtype=int64))
我們把它拼接為一個(gè) ndarray 對(duì)象:
In [115]: np.array(np.where(a>4))
Out[115]:
array([[1, 1, 1, 1, 1],[0, 1, 2, 3, 4]], dtype=int64)
然后,再轉(zhuǎn)置,使用 np.transpose 方法:
In [117]: np.transpose(x)
Out[117]:
array([[1, 0],[1, 1],[1, 2],[1, 3],[1, 4]], dtype=int64)In [118]:
可以很明顯的看出 [1, 0] 表示大于 4 的元素在原 ndarray 對(duì)象的索引。
2. Numpy 數(shù)組屬性
2.1 shape 屬性
shape 屬性返回?cái)?shù)組的形狀信息,是一個(gè)元組對(duì)象。
In [118]: a = np.zeros(5)In [120]: b = np.ones((2, 3))In [121]: a
Out[121]: array([0., 0., 0., 0., 0.])In [122]: b
Out[122]:
array([[1., 1., 1.],[1., 1., 1.]])
可以看到 a 是一維的,而 b 是一個(gè) 2*3 的數(shù)組,打印它們的 shape 信息,可以看到:
In [124]: a.shape
Out[124]: (5,)In [125]: b.shape
Out[125]: (2, 3)In [126]:
2.2 size 屬性
size 屬性獲取數(shù)組內(nèi)元素個(gè)數(shù):
In [126]: a.size
Out[126]: 5In [127]: b.size
Out[127]: 6In [128]:
2.3 dtype 屬性
dtype 屬性獲取數(shù)組內(nèi)元素的類(lèi)型:
In [128]: a.dtype
Out[128]: dtype('float64')In [129]: b.dtype
Out[129]: dtype('float64')
創(chuàng)建數(shù)組時(shí),還可以通過(guò)為 dtype 賦值,指定元素類(lèi)型:
In [134]: m = np.array([1,2,3])In [135]: m.dtype
Out[135]: dtype('int32')In [136]: m = np.array([1,2,3], dtype='float')In [137]: m.dtype
Out[137]: dtype('float64')
dtype 更多取值: int 、 complex 、 bool 、 object ,還可以顯示的定義數(shù)據(jù)位數(shù)的類(lèi)型,如: int64 、 int16 、 float128 、 complex128 。
3. 數(shù)組函數(shù)
3.1 arange 函數(shù)
起始點(diǎn),終點(diǎn),步長(zhǎng);不包括終點(diǎn)。
In [138]: np.arange(1, 10, 2)
Out[138]: array([1, 3, 5, 7, 9])In [139]:
3.2 linspace 函數(shù)
起始點(diǎn),終點(diǎn),分割份數(shù);包括終點(diǎn)。
In [139]: np.linspace(1, 10, 7)
Out[139]: array([ 1. , 2.5, 4. , 5.5, 7. , 8.5, 10. ])In [140]:
3.3 logspace 函數(shù)
創(chuàng)建以 e 為底,指數(shù)為 1,2,…,10 的數(shù)組:
In [140]: np.logspace(1, 10, 3)
Out[140]: array([1.00000000e+01, 3.16227766e+05, 1.00000000e+10])In [141]:
3.4 diag 對(duì)角函數(shù)
創(chuàng)建對(duì)角數(shù)組:
In [141]: np.diag([1,2,3,4])
Out[141]:
array([[1, 0, 0, 0],[0, 2, 0, 0],[0, 0, 3, 0],[0, 0, 0, 4]])
主對(duì)角線偏移 1 的數(shù)組:
In [142]: np.diag([1,2,3,4],k=1)
Out[142]:
array([[0, 1, 0, 0, 0],[0, 0, 2, 0, 0],[0, 0, 0, 3, 0],[0, 0, 0, 0, 4],[0, 0, 0, 0, 0]])In [143]:
3.5 zeros 函數(shù)
創(chuàng)建一個(gè)全零的數(shù)組,接受參數(shù)為數(shù)組的維度
In [143]: np.zeros(3)
Out[143]: array([0., 0., 0.])In [145]: np.zeros((3,4))
Out[145]:
array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])In [146]: np.zeros((2,3,4))
Out[146]:
array([[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]],[[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]]])In [147]:
3.6 ones 函數(shù)
創(chuàng)建一個(gè)全 1 的數(shù)組
In [147]: np.ones(3)
Out[147]: array([1., 1., 1.])In [148]: np.ones((2,3))
Out[148]:
array([[1., 1., 1.],[1., 1., 1.]])In [149]: np.ones((2,3,1))
Out[149]:
array([[[1.],[1.],[1.]],[[1.],[1.],[1.]]])In [150]:
3.7 random 隨機(jī)數(shù)組
生成 0~1、shape 為 (2,3) 的隨機(jī)數(shù)數(shù)組:
In [151]: np.random.rand(2,3)
Out[151]:
array([[0.50761977, 0.73557945, 0.84018083],[0.1117079 , 0.02225728, 0.51466307]])In [152]:
4. 多維索引和篩選
4.1 二維數(shù)組
In [37]: a = np.arange(25).reshape(5,5)In [38]: a
Out[38]:
array([[ 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]])In [39]: a[0]
Out[39]: array([0, 1, 2, 3, 4])In [40]: a[1]
Out[40]: array([5, 6, 7, 8, 9])In [43]: a[0:2]
Out[43]:
array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])In [47]: a[1:3]
Out[47]:
array([[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]])In [48]: a[0][0]
Out[48]: 0In [53]: a[0,0]
Out[53]: 0In [51]:
a[0][0] 和 a[0,0] 是等價(jià)的。
4.2 三維數(shù)組
NumPy 索引,功能強(qiáng)大,不僅支持切片操作,還支持布爾型按條件篩選操作。
In [152]: m = np.arange(18).reshape(2,3,3)In [153]: n = np.arange(18)In [154]: m
Out[154]:
array([[[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8]],[[ 9, 10, 11],[12, 13, 14],[15, 16, 17]]])
: 表示此維度的所有元素全部獲取:
In [155]: m[:,1:2,:]
Out[155]:
array([[[ 3, 4, 5]],[[12, 13, 14]]])In [156]: m[:,1:2,:1]
Out[156]:
array([[[ 3]],[[12]]])In [157]:
按照維度賦值:
In [157]: m[:,0,:] = -2In [158]: m
Out[158]:
array([[[-2, -2, -2],[ 3, 4, 5],[ 6, 7, 8]],[[-2, -2, -2],[12, 13, 14],[15, 16, 17]]])In [159]: m[:,:,1]
Out[159]:
array([[-2, 4, 7],[-2, 13, 16]])In [160]:
判斷上面切片 m[:,:,0] 中大于 5 的元素,寫(xiě)法簡(jiǎn)潔,無(wú)需寫(xiě) for 循環(huán)。
In [160]: m
Out[160]:
array([[[-2, -2, -2],[ 3, 4, 5],[ 6, 7, 8]],[[-2, -2, -2],[12, 13, 14],[15, 16, 17]]])In [161]: m[m>5]
Out[161]: array([ 6, 7, 8, 12, 13, 14, 15, 16, 17])In [162]:
總結(jié)
以上是生活随笔為你收集整理的Numpy 一维、二维数组、size/dtype/shape属性、数组函数arange/linspace/logspace /diag/zeros/ones/random 、多维数组索引和筛选)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “翦碎红绡却作团”上一句是什么
- 下一篇: Numpy 生成 Bool型数组、一维转