NumPy 切片和索引ndarray對(duì)象的內(nèi)容可以通過(guò)索引或切片來(lái)訪問(wèn)和修改,,與 Python 中 list 的切片操作一樣。 ndarray 數(shù)組可以基于 0 - n 的下標(biāo)進(jìn)行索引,,切片對(duì)象可以通過(guò)內(nèi)置的 slice 函數(shù),并設(shè)置 start, stop 及 step 參數(shù)進(jìn)行,,從原數(shù)組中切割出一個(gè)新數(shù)組,。 import numpy as npa = np.arange(10)s = slice(2,7,2) # 從索引 2 開(kāi)始到索引 7 停止,,間隔為2print(a[s])# 我們也可以通過(guò)冒號(hào)分隔切片參數(shù) start:stop:step 來(lái)進(jìn)行切片操作:b = a[2:7:2] # 從索引 2 開(kāi)始到索引 7 停止,間隔為 2print(b)
NumPy 高級(jí)索引NumPy 比一般的 Python 序列提供更多的索引方式,。 除了之前看到的用整數(shù)和切片的索引外,,數(shù)組可以由整數(shù)數(shù)組索引、布爾索引 及花式索引,。 整數(shù)數(shù)組索引以下實(shí)例獲取數(shù)組中 (0,0),,(1,1) 和 (2,0) 位置處的元素。 import numpy as npx = np.array([[1,2],[3,4],[5,6]])y = x[[0,1,2],[0,1,0]]print(y)
布爾索引我們可以通過(guò)一個(gè)布爾數(shù)組來(lái)索引目標(biāo)數(shù)組,。 布爾索引通過(guò)布爾運(yùn)算(如:比較運(yùn)算符)來(lái)獲取符合指定條件的元素的數(shù)組,。 以下實(shí)例獲取大于 5 的元素: import numpy as npx = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print ('我們的數(shù)組是:')print (x)print ('\n')# 現(xiàn)在我們會(huì)打印出大于 5 的元素 print ('大于 5 的元素是:')print (x[x > 5])
花式索引花式索引指的是利用整數(shù)數(shù)組進(jìn)行索引。 花式索引根據(jù)索引數(shù)組的值作為目標(biāo)數(shù)組的某個(gè)軸的下標(biāo)來(lái)取值,。 對(duì)于使用一維整型數(shù)組作為索引,,如果目標(biāo)是一維數(shù)組,那么索引的結(jié)果就是對(duì)應(yīng)位置的元素,,如果目標(biāo)是二維數(shù)組,,那么就是對(duì)應(yīng)下標(biāo)的行。 花式索引跟切片不一樣,,它總是將數(shù)據(jù)復(fù)制到新數(shù)組中,。 一維數(shù)組一維數(shù)組只有一個(gè)軸 axis = 0,所以一維數(shù)組就在 axis = 0 這個(gè)軸上取值: import numpy as npx = np.arange(9)print(x) # 一維數(shù)組讀取指定下標(biāo)對(duì)應(yīng)的元素print('-------讀取下標(biāo)對(duì)應(yīng)的元素-------')x2 = x[[0, 6]] # 使用花式索引print(x2)print(x2[0])
二維數(shù)組傳入順序索引數(shù)組 import numpy as npx=np.arange(32).reshape((8,4))print(x) # 二維數(shù)組讀取指定下標(biāo)對(duì)應(yīng)的行print('-------讀取下標(biāo)對(duì)應(yīng)的行-------')print (x[[4,2,1,7]])
NumPy 廣播(Broadcast)廣播(Broadcast)是 numpy 對(duì)不同形狀(shape)的數(shù)組進(jìn)行數(shù)值計(jì)算的方式,, 對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行,。 如果兩個(gè)數(shù)組 a 和 b 形狀相同,即滿足 a.shape == b.shape,,那么 a*b 的結(jié)果就是 a 與 b 數(shù)組對(duì)應(yīng)位相乘,。這要求維數(shù)相同,且各維度的長(zhǎng)度相同,。 import numpy as np a = np.array([1,2,3,4]) b = np.array([10,20,30,40]) c = a * b print (c)
當(dāng)運(yùn)算中的 2 個(gè)數(shù)組的形狀不同時(shí),,numpy 將自動(dòng)觸發(fā)廣播機(jī)制。
[[ 0 1 2] [10 11 12] [20 21 22] [30 31 32]] 下面的圖片展示了數(shù)組 b 如何通過(guò)廣播來(lái)與數(shù)組 a 兼容,。 4x3 的二維數(shù)組與長(zhǎng)為 3 的一維數(shù)組相加,,等效于把數(shù)組 b 在二維上重復(fù) 4 次再運(yùn)算:
[[ 1 2 3] [11 12 13] [21 22 23] [31 32 33]] 廣播的規(guī)則:
簡(jiǎn)單理解:對(duì)兩個(gè)數(shù)組,,分別比較他們的每一個(gè)維度(若其中一個(gè)數(shù)組沒(méi)有當(dāng)前維度則忽略),,滿足:
NumPy 迭代數(shù)組NumPy 迭代器對(duì)象 numpy.nditer 提供了一種靈活訪問(wèn)一個(gè)或者多個(gè)數(shù)組元素的方式,。 迭代器最基本的任務(wù)的可以完成對(duì)數(shù)組元素的訪問(wèn)。 接下來(lái)我們使用 arange() 函數(shù)創(chuàng)建一個(gè) 2X3 數(shù)組,,并使用 nditer 對(duì)它進(jìn)行迭代,。
原始數(shù)組是:[[0 1 2] [3 4 5]]迭代輸出元素:0, 1, 2, 3, 4, 5, 控制遍歷順序
In [13]:
原始數(shù)組是:[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]原始數(shù)組的轉(zhuǎn)置是:[[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]]以 C 風(fēng)格順序排序:[[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]]0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55, 以 F 風(fēng)格順序排序:[[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]]0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 修改數(shù)組中元素的值nditer 對(duì)象有另一個(gè)可選參數(shù) op_flags,。 默認(rèn)情況下,,nditer 將視待迭代遍歷的數(shù)組為只讀對(duì)象(read-only),為了在遍歷數(shù)組的同時(shí),,實(shí)現(xiàn)對(duì)數(shù)組元素值得修改,,必須指定 read-write 或者 read-only 的模式。
原始數(shù)組是:[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]修改后的數(shù)組是:[[ 0 10 20 30] [ 40 50 60 70] [ 80 90 100 110]] 使用外部循環(huán)
原始數(shù)組是:[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]修改后的數(shù)組是:[ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55], 廣播迭代如果兩個(gè)數(shù)組是可廣播的,,nditer 組合對(duì)象能夠同時(shí)迭代它們,。 假設(shè)數(shù)組 a 的維度為 3X4,數(shù)組 b 的維度為 1X4 ,,則使用以下迭代器(數(shù)組 b 被廣播到 a 的大?。?/span>
第一個(gè)數(shù)組為:[[ 0 5 10 15] [20 25 30 35] [40 45 50 55]]第二個(gè)數(shù)組為:[1 2 3 4]修改后的數(shù)組為:0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4, |
|
來(lái)自: 網(wǎng)摘文苑 > 《NumPy》