索引和切片2
布爾型索引
假設有一個用於存儲數據的數組以及一個存儲姓名的數組(含有重複項),先使用numpy.random中的randn函數生成一些正態分布的隨機數據:
假設每個名字都對應data數組中的一行,而我們想要選出對應於名字「Bob」的所有行。跟算術運算一樣,數組的比較運算(如:==)也是矢量化的。因此,對names和字元串「Bob」的比較運算將會產生一個布爾型數組:
這個布爾數組也可以用於數組索引:
注意:布爾型數組的長度必須跟被索引的軸長度一致。另外,布爾型數組可以跟切片、整數混合使用:
要選擇除「Bob」以外的其他值,既可以使用不等於符號(!=),也可以通過負號(~)對條件進行否定:
如果要選取三個名字中的兩個需要組合應用多個布爾條件,使用&(和)、|(或)之類的布爾算術運算符即可:
通過布爾型索引選取數組中的數據,將總是創建數據的副本,即使返回一模一樣的數組。
注意:Python關鍵字and 和 or 在布爾型數組中無效。
設置布爾型數組的值
將data中所有負值設置為0:
通過一維布爾數組設置整行或列的值:
花式索引
花式索引是一個NumPy術語,指的是利用整數數組進行索引。假設我們有一個8 X 4數組:
為了按照特定順序選取行子集,需要傳入一個指定順序的整數列表或ndarray:
使用負數索引將會從末尾開始選取行:
一次傳入多個索引數組,返回的是一個一維數組,其中的元素對應各個元祖:
其中第79行代碼的arange函數用於創建等差數組,這裡作用是返回一個由0到31共32個數構成的數組對象。
第80行代碼返回的是一個一維數組,其中結果是由代碼80行中arr[[1,5,7,2],[0,3,1,2]] 索引,結果中的4是數組array中第1行第0列的數字;結果中的23是數組array中第5行第3列數字,後面以此類推。
花式索引跟切片的區別是,花式索引總是將數據複製到新數組中。
python的range函數與numpy的arange函數區別
range函數返回的是list,arange返回的是一個數據:
推薦閱讀: