索引和切片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返回的是一個數據:


推薦閱讀:

TAG:Python | numpy | 数据分析 |