NumPy索引介紹之?dāng)?shù)組的索引和切片用法
NumPy的數(shù)組對象ndarrays可以和Python標(biāo)準(zhǔn)序列數(shù)據(jù)類型一樣,使用 x[obj] 進(jìn)行索引操作。其中,x是數(shù)組,obj是索引選擇。有三種可用的索引:基本切片、高級索引、字段訪問。
一、基本切片和索引
Python序列的切片操作是一維的,NumPy 將對數(shù)組的切片拓展到了N維。
基本切片語法 i:j:k:其中i是起始索引,j是停止索引,k是步長。
對于多維數(shù)組的索引 array[(x, y, z)]可以被簡寫成x[x, y, z],這也是NumPy的語法糖。
示例:
>>>x = np.arange(10)
>>>x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
# 簡單索引
>>>x[3]
3
# 一維切片
>>>x = np.arange(10)
>>>x[1:7:2]
array([1, 3, 5])
# 多維切片
>>>y = np.arange(20).reshape(4,5)
>>>y
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>>y[1:4, 1:4]
array([[ 6, 7, 8],
[11, 12, 13],
[16, 17, 18]])
# i和j為負(fù),則可看作為n+i和n+j,n為維度中元素數(shù)量。
# k為負(fù),則步長向前。
>>>x[-2:10]
array([8, 9])
>>>x[-3:3:-1]
array([7, 6, 5, 4])
# 默認(rèn)寫法 ":"
>>>x[4:]
array([4, 5, 6, 7, 8, 9])
# 如果索引元組的元素數(shù)小于維度,則假定任何其它維
>>> z = np.array([[[1],[2],[3]], [[4],[5],[6]]])
>>> z.shape
(2, 3, 1)
>>> z[1:2]
array([[[4],
[5]
[6]]])
# 索引中可以使用 "..." 代指其它維度的全部索引,一個索引中只能有一個省略號
>>>z[...,0]
array([[1, 2, 3],
[4, 5, 6]])
# 使用newaxis 增加維度
>>>z[:,np.newaxis,:,:].shape
(2, 1, 3, 1)
注意
索引 i 和 i:i+1的區(qū)別:
>>>z = np.array([[[1],[2],[3]], [[4],[5],[6]]]) >>>z[0, 0, 0], z[0:1, 0, 0] (1, array([1]))
- 可以使用切片來設(shè)置數(shù)組的值,但不能改變數(shù)組的形狀
- 基本切片只返回數(shù)據(jù)的視圖,并不會返回數(shù)據(jù)的拷貝
二、高級索引
高級索引有兩種類型:整數(shù)蘇松陰和布爾索引。與基本切片不同,高級索引返回數(shù)組的副本。
2.1 整數(shù)數(shù)組索引
# 整數(shù)數(shù)組分別表示所需索引的下標(biāo)。
# 取點[0,0], [1,1], [2,0]
>>>x = np.array([[1, 2], [3, 4], [5, 6]])
>>>x[[0,1,2], [0,1,0]]
array([1, 4, 5])
# 獲取了 4X3 數(shù)組中的四個角的元素。
# 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。
>>> x = array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> rows = np.array([[0, 0],
... [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
... [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0, 2],
[ 9, 11]])
# 使用np.ix_(rows, columns)獲得相同效果
>>>x[[0,3], [0,2]
注意:
如果高級索引和基本切片的結(jié)果數(shù)組相同,優(yōu)先使用切片。但是如果需要副本有不同的存儲位置,則使用高級索引。
2.2 布爾索引
當(dāng)索引對象是布爾類型時, 也會發(fā)生高級索引。
# 對于array[obj]
# 如果array.ndim == obj.ndim,
# 將返回一個一維數(shù)組,其中包含所有obj中為 True 的位置的元素,以row-major為順序。
>>>x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
>>>np.isnan(x),x[~np.isnan(x)]
(array([[False, False],
[ True, False],
[ True, True]]),
array([1., 2., 3.]))
# 使用ix_()功能
>>> x = array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> rows = (x.sum(-1) % 2) == 0
>>> rows
array([False, True, False, True])
>>> columns = [0, 2]
>>> x[np.ix_(rows, columns)]
array([[ 3, 5],
[ 9, 11]])
2.3 字段索引
如果數(shù)組對象是結(jié)構(gòu)化數(shù)組,則可以使用字符串索引來訪問數(shù)組的字段。使用方式和字典類似。
>>> x = np.zeros((2,2), dtype=[('a', np.int32), ('b', np.float64, (3,3))])
>>>x
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.], [0., 0., 0.], [0., 0., 0.]]),
(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])]],
dtype=[('a', '<i4'), ('b', '<f8', (3, 3))])
>>>x['a']
array([[0, 0],
[0, 0]])
>>>x['a'].dtype
dtype('int32')
>>>x['b']
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.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]]]])
>>>x['b'].dtype
dtype('float64')
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)讀取txt文件并轉(zhuǎn)換為excel的方法示例
這篇文章主要介紹了Python實現(xiàn)讀取txt文件并轉(zhuǎn)換為excel的方法,涉及Python針對txt文件的讀取及Excel格式文件生成相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Linux RedHat下安裝Python2.7開發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了Linux RedHat下安裝Python2.7、pip、ipython環(huán)境、eclipse和PyDev環(huán)境,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Pytorch中TensorDataset與DataLoader的使用方式
這篇文章主要介紹了Pytorch中TensorDataset與DataLoader的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
一文詳解Python數(shù)據(jù)類型:數(shù)字、布爾與None的語義
在 Python 中,一切皆對象,每個對象都屬于特定的數(shù)據(jù)類型,理解數(shù)據(jù)類型的特性和行為是編寫高質(zhì)量 Python 代碼的關(guān)鍵,本文將深入探討 Python 的核心數(shù)據(jù)類型:數(shù)字、布爾值和 None,揭示它們背后的設(shè)計哲學(xué)和使用技巧2025-11-11
python數(shù)據(jù)結(jié)構(gòu)的排序算法
下面是是對python數(shù)據(jù)結(jié)構(gòu)的排序算法的一些講解及示意圖,感興趣的小伙伴一起來學(xué)習(xí)吧2021-08-08

