python布尔系列_python数据分析类库系列-Numpy之布尔型索引
我們了解了如何使用索引進行切片以及選擇 ndarray 元素。當我們知道要選擇的元素的確切索引時,這些方法很有用。但是,在很多情況下,我們不知道要選擇的元素的索引。例如,假設有一個 10,000 x 10,000 ndarray,其中包含從 1 到 15,000 的隨機整數,我們只想選擇小于 20 的整數。這時候就要用到布爾型索引。
來看這樣一個例子,假設我們有一個用于存儲數據的數組以及一個存儲姓名的數組(含有重復項)。在這里,我將使用numpy.random中的randn函數生成一些正態分布的隨機數據:
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data =np.random.randn(7,4)
data
out
array([[-0.53447574, 0.44543995, 0.20598584, 1.08783591],
[-0.77863291, 0.19012144, -0.57628278, 2.21230602],
[-1.94785822, 1.75829325, 0.76416317, -0.26749686],
[ 1.55128542, -0.48229173, -0.10775036, 1.82210628],
[-0.75344013, 1.49328631, 0.19576227, -1.37773471],
[-0.28998065, -0.54219643, 0.44587161, -1.17333163],
[ 2.28372601, 0.9102604 , -0.15811983, 1.16763758]])
假設每個名字都對應data數組中的一行,而我們想要選出對應于名字"Bob"的所有行。跟算術運算一樣,數組的比較運算(如==)也是矢量化的。因此,對names和字符串"Bob"的比較運算將會產生一個布爾型數組:
names == "Bob"
out
array([ True, False, False, True, False, False, False])
********************************************************
data[names =='Bob'] #True為選擇,False為不選擇
out
array([[7., 7., 7., 7.],
[7., 7., 7., 7.]])
布爾型數組的長度必須跟被索引的軸長度一致。此外,還可以將布爾型數組跟切片、整數(或整數序列,稍后將對此進行詳細講解)混合使用:
data[names == 'Bob']
out
array([[-1.33599022, 0.04700321, 0.98537189, 0.33183721],
[-0.2225323 , 0.10320653, 1.24636372, -0.38496333]])注意:如果布爾型數組的長度不對,布爾型選擇就會出錯,因此一定要小心。
下面的例子,我選取了names == 'Bob'的行,并索引了列:
data[names == 'Bob', 2:]
out
array([[ 0.98537189, 0.33183721],
[ 1.24636372, -0.38496333]])
********************************************************
data[names == 'Bob', 3]
out
要選擇除"Bob"以外的其他值,既可以使用不等于符號(!=),也可以通過~對條件進行否定:
names != "Bob"
out
array([False, True, True, False, True, True, True])
********************************************************
data[~(names == 'Bob')]
out
array([[ 0.04813526, 0.481971 , -0.23318465, -0.08770203],
[ 2.39572745, -0.03834795, -0.49294046, -0.76124253],
[-0.30962763, 0.3454903 , 0.30120547, 0.82999187],
[-1.46354427, -1.00491798, 0.4574028 , 1.26923957],
[ 0.46142634, 1.55466835, -0.54772161, -0.65769753]])
~操作符用來反轉條件很好用
cond = names == 'Bob'
data[~cond]
out
array([[ 0.04813526, 0.481971 , -0.23318465, -0.08770203],
[ 2.39572745, -0.03834795, -0.49294046, -0.76124253],
[-0.30962763, 0.3454903 , 0.30120547, 0.82999187],
[-1.46354427, -1.00491798, 0.4574028 , 1.26923957],
[ 0.46142634, 1.55466835, -0.54772161, -0.65769753]])
選取這三個名字中的兩個需要組合應用多個布爾條件,使用&(和)、|(或)之類的布爾算術運算符即可:
mask = (names == "Bob") | (names == "Will" )
mask
out
array([ True, False, True, True, True, False, False])
********************************************************
data[mask]
out
array([[-1.33599022, 0.04700321, 0.98537189, 0.33183721],
[ 2.39572745, -0.03834795, -0.49294046, -0.76124253],
[-0.2225323 , 0.10320653, 1.24636372, -0.38496333],
[-0.30962763, 0.3454903 , 0.30120547, 0.82999187]])
通過布爾型索引選取數組中的數據,將總是創建數據的副本,即使返回一模一樣的數組也是如此。注意:Python關鍵字and和or在布爾型數組中無效。要使用&與|。
通過布爾型數組設置值是一種經常用到的手段。為了將data中的所有負值都設置為0,我們只需:
data[data < 0] = 0
data
out
array([[0. , 0.04700321, 0.98537189, 0.33183721],
[0.04813526, 0.481971 , 0. , 0. ],
[2.39572745, 0. , 0. , 0. ],
[0. , 0.10320653, 1.24636372, 0. ],
[0. , 0.3454903 , 0.30120547, 0.82999187],
[0. , 0. , 0.4574028 , 1.26923957],
[0.46142634, 1.55466835, 0. , 0. ]])
通過一維布爾數組設置整行或列的值也很簡單:
data[names != 'Joe'] = 7
data
out
array([[7. , 7. , 7. , 7. ],
[0.04813526, 0.481971 , 0. , 0. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0. , 0. , 0.4574028 , 1.26923957],
[0.46142634, 1.55466835, 0. , 0. ]])
后面會看到,這類二維數據的操作也可以用pandas方便的來做。
下期我們將分享Numpy的花式索引,如果喜歡請點贊收藏,您的支持是我最大的動力,謝謝大家,共同進步。掃描二維碼關注全部內容
總結
以上是生活随笔為你收集整理的python布尔系列_python数据分析类库系列-Numpy之布尔型索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 加入debug后可以进入contr
- 下一篇: python正则表达式操作指南_Pyth