溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)ndarray數(shù)組的索引和切片?

發(fā)布時(shí)間:2020-05-26 16:05:11 來(lái)源:億速云 閱讀:223 作者:鴿子 欄目:云計(jì)算

索引:獲取數(shù)組中特定位置元素的過(guò)程
切片:獲取數(shù)組元素子集的過(guò)程
import numpy as np

一維數(shù)組
一維數(shù)組的索引和切片與python中的列表類似
索引:若元素個(gè)數(shù)為n,則索引下標(biāo)可表示為[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]
print(''8+'一維數(shù)組的索引和切片'+''8)

若元素個(gè)數(shù)為n,則索引下標(biāo)可表示為[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]

ar1 = np.array([5, 6, 7, 8, 9])
print(ar1[4])   # 索引自左向右從下標(biāo)0開始
print(ar1[-2])  # 索引自右向左從下標(biāo)-1遞減,最右邊為-1,相鄰的為-2
切片:切片可用三元素冒號(hào)分割
ar1[起始編號(hào) : 終止編號(hào)(不含) : 步長(zhǎng)],起始編號(hào)默認(rèn)是0,終止編號(hào)默認(rèn)是n,步長(zhǎng)默認(rèn)是1

仍然是ndarray數(shù)組
b = ar1[1:4:2]
print(b)
print(type(b))
多維數(shù)組
ar2 = np.arange(24).reshape((2, 3, 4))
print(''8+'多維數(shù)組的索引和切片'+''8)
多維數(shù)組的索引,每個(gè)維度一個(gè)索引值,逗號(hào)分隔————r2[ax0上索引,ax1上索引,ax2上索引],各個(gè)維度索引和一維相同0~n-1或-n~-1
print(ar2)
print(ar2[1, 1, 2])
print(ar2[-1, -2, -2])
多維數(shù)組的切片,逗號(hào)分隔,每個(gè)維度同一維切片一樣,用三冒號(hào)分隔, 如果只有一個(gè):表示選取整個(gè)維度
print(ar2[:, 1:3, :])
print(ar2[:, 1:3, ::2])
print(ar2[:, 1, -3])
索引數(shù)組:將數(shù)組作為索引,通常是一維數(shù)組(每個(gè)元素代表對(duì)應(yīng)維度索引)
1.布爾索引
布爾數(shù)組:顧名思義,元素類型為布爾值的數(shù)組,同樣可以是一維或者多維數(shù)組

例如:bool_arr1 = np.array([True, False, False, False, False, False,True])

如下的數(shù)組定義也是布爾數(shù)組

names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
bool_arr2 = names == 'Zhang'
此時(shí)bool_arr2為array[False True False False False False False]

若想得到bool_arr1,則:bool_arr1 = (names == 'Liu') | (names == 'Kong')

同樣的,與 &、非 ~ 、不等于 != 、>=、<=、>、<等條件判斷同樣可以用于布爾數(shù)組賦值語(yǔ)句里。

注意!Python中的關(guān)鍵字and和or對(duì)布爾值數(shù)組并沒(méi)有用,is在特殊情況可能會(huì)有效,即判斷兩個(gè)布爾數(shù)組是否相等

如:bool_arr3 = ~(names == 'Zhang')等價(jià)于boo_arr3 = names != 'Zhang'

將一維布爾數(shù)組 作為 布爾索引數(shù)組,例如:

names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
bool_arr2 = names == 'Zhang'
data = np.arange(21).reshape((7,3))
print(data)
print(data[bool_arr2])
輸出為:

[[ 0  1  2]
[[ 0  1  2]
[ 3  4  5]
[ 6  7  8]
[ 9 10 11]
[12 13 14]
[15 16 17]
[18 19 20]] # data

[[3 4 5]]   # data[bool_arr2]
2.神奇索引
使用整數(shù)數(shù)組作為數(shù)據(jù)索引數(shù)組,整數(shù)數(shù)組可以是一維或多維

2.1一維數(shù)據(jù)索引數(shù)組
一維數(shù)據(jù)索引數(shù)組傳遞包含指定順序的列表或數(shù)組。即:

一維數(shù)據(jù)索引數(shù)據(jù)每個(gè)元素i代表數(shù)組軸axis=0上,即取第1維的第i個(gè)數(shù)據(jù)。

例1:

data1 = np.arange(28).reshape((7, 4))
print(data1)
print('-'20 + 'data1[[1, 5, 6, 2, 1]]' + '-'20)
print(data1[[1, 5, 6, 2, 1]])
print('-'20 + 'data1[[-1, 3, -2, -5, 1]]' + '-'20)
print(data1[[-1, 3, -2, -5, 1]])
輸出為:

[[ 0  1  2  3]  # 0或-7
[ 4  5  6  7]  # 1或-6
[ 8  9 10 11]  # 2或-5
[12 13 14 15]  # 3或-4
[16 17 18 19]  # 4或-3
[20 21 22 23]  # 5或-2
[24 25 26 27]] # 6或-1
--------------------data1[[1, 5, 6, 2, 1]]--------------------
[[ 4  5  6  7]
[20 21 22 23]
[24 25 26 27]
[ 8  9 10 11]
[ 4  5  6  7]]
--------------------data1[[-1, 3, -2, -5, 1]]--------------------
[[24 25 26 27]
[12 13 14 15]
[20 21 22 23]
[ 8  9 10 11]
[ 4  5  6  7]]
例2:

data2 = np.arange(48).reshape((4, 4, 3))
print(data2)
print('-'20 + 'data2[[3, 0, 2, 1, 0]]' + '-'20)
print(data2[[3, 0, 2, 1, 0]])
print('-'20 + 'data2[[-1, -2, 1, 2]]' + '-'20)
print(data2[[-1, -2, 1, 2]])
輸出為:

[[[ 0  1  2]
[ 3  4  5]
[ 6  7  8]
[ 9 10 11]]   # 0或-4

[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]   # 1或-3

[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]   # 2或-2

[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]]  # 3或-1
--------------------data2[[3, 0, 2, 1, 0]]--------------------
[[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]

[[ 0  1  2]
[ 3  4  5]
[ 6  7  8]
[ 9 10 11]]

[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]

[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]

[[ 0  1  2]
[ 3  4  5]
[ 6  7  8]
[ 9 10 11]]]
--------------------data2[[-1, -2, 1, 2]]--------------------
[[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]

[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]

[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]

[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]]
data2是多維數(shù)組,其在軸axis=0共有4個(gè)數(shù)據(jù),每個(gè)數(shù)據(jù)其實(shí)又是一個(gè)數(shù)組

2.2 多個(gè)索引數(shù)組
傳遞多個(gè)索引數(shù)組作為索引時(shí),會(huì)根據(jù)每個(gè)索引數(shù)組對(duì)應(yīng)元素選出一個(gè)一維數(shù)組

每個(gè)索引數(shù)組大小應(yīng)相同,設(shè)為n數(shù)組個(gè)數(shù)應(yīng)等于數(shù)據(jù)數(shù)組的維數(shù),相當(dāng)于得到n個(gè)點(diǎn)的坐標(biāo),坐標(biāo)分量即為數(shù)據(jù)數(shù)組對(duì)應(yīng)維度。

例:

data3 = np.arange(32).reshape((8, 4))
print(data3)
print('-'20 + 'data3[[1, 5, 7, 2], [0, 3, 1, 2]]' + '-'20)
print(data3[[1, 5, 7, 2], [0, 3, 1, 2]])
data4 = np.arange(48).reshape((4, 4, 3))
print('-'20 + 'data4' + '-'40)
print(data4)
print('-'20 + 'ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]' + '-'20)
print(data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]])
輸出為:

0  1  2  3   #  “坐標(biāo)”
0[[ 0  1  2  3]
1 [ 4  5  6  7]
2 [ 8  9 10 11]
3 [12 13 14 15]
4 [16 17 18 19]
5 [20 21 22 23]
6 [24 25 26 27]
7 [28 29 30 31]]
--------------------data3[[1, 5, 7, 2], [0, 3, 1, 2]]--------------------
[ 4 23 29 10]
--------------------data4----------------------------------------
[[[ 0  1  2]
[ 3  4  5]       # 0(axis=0)
[ 6  7  8]
[ 9 10 11]]

[[12 13 14]
[15 16 17]      # 1
[18 19 20]
[21 22 23]]

[[24 25 26]
[27 28 29]      # 2
[30 31 32]
[33 34 35]]

[[36 37 38]
[39 40 41]     # 3
[42 43 44]
[45 46 47]]]
--------------------ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]--------------------
[44 41 18 26 10]
data3[[1, 5, 7, 2], [0, 3, 1, 2]] 即為“坐標(biāo)“為(1,0)、(5,3)、(7,1)、(2,2)的元素被選中。

data4是一個(gè)三維數(shù)組,在0軸上,又是一個(gè)二維數(shù)組,同理:

data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]]即為坐標(biāo)為(3,2,2)、(3,1,2)、(1,2,0)、(2,0,2)、(0,3,1)的元素

2.3神奇索引發(fā)揮類似切片功能
切片是逗號(hào)分隔,在每一維上可用一維數(shù)據(jù)索引數(shù)組作為其索引

多個(gè)索引數(shù)組其實(shí)就是一種特殊的切片,每維索引都是一個(gè)一維數(shù)據(jù)索引

例:

data3 = np.arange(32).reshape((8, 4))
print(data3)
kols = data3[[1, 5, 7, 2]]
print('-'20 + 'kols' + '-'20)
print(kols)
print('-'20 + 'data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]' + '-'20)
print(data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]])
輸出為:

[[ 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 25 26 27]
[28 29 30 31]]
--------------------kols--------------------
[[ 4  5  6  7]
[20 21 22 23]
[28 29 30 31]
[ 8  9 10 11]]
--------------------data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]--------------------
[[ 4  7  5  6  7]
[20 23 21 22 23]
[28 31 29 30 31]
[ 8 11  9 10 11]]
data3[[1, 5, 7, 2]][:, [0, 3, 1, 2]]其實(shí)就是data3[[1, 5, 7, 2]],即kols的切片,切片第一維取全部,即全部行。

第二維取一維數(shù)據(jù)數(shù)組[0,3,1,2]即:

新數(shù)組第一列為kols第一列(0)[4 20 28 8]

第二列為kols第4列(3)[7 23 31 11]

第三列為kols第2列(1)[5 21 29 9]

第四列為kols第3列(2)[6 22 30 10]

第五列為kols第4列(3)[7 23 31 11]。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI