python布尔系列_python数据分析类库系列-Numpy之布尔型索引
我們了解了如何使用索引進行切片以及選擇 ndarray 元素。當(dāng)我們知道要選擇的元素的確切索引時,這些方法很有用。但是,在很多情況下,我們不知道要選擇的元素的索引。例如,假設(shè)有一個 10,000 x 10,000 ndarray,其中包含從 1 到 15,000 的隨機整數(shù),我們只想選擇小于 20 的整數(shù)。這時候就要用到布爾型索引。
來看這樣一個例子,假設(shè)我們有一個用于存儲數(shù)據(jù)的數(shù)組以及一個存儲姓名的數(shù)組(含有重復(fù)項)。在這里,我將使用numpy.random中的randn函數(shù)生成一些正態(tài)分布的隨機數(shù)據(jù):
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]])
假設(shè)每個名字都對應(yīng)data數(shù)組中的一行,而我們想要選出對應(yīng)于名字"Bob"的所有行。跟算術(shù)運算一樣,數(shù)組的比較運算(如==)也是矢量化的。因此,對names和字符串"Bob"的比較運算將會產(chǎn)生一個布爾型數(shù)組:
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.]])
布爾型數(shù)組的長度必須跟被索引的軸長度一致。此外,還可以將布爾型數(shù)組跟切片、整數(shù)(或整數(shù)序列,稍后將對此進行詳細講解)混合使用:
data[names == 'Bob']
out
array([[-1.33599022, 0.04700321, 0.98537189, 0.33183721],
[-0.2225323 , 0.10320653, 1.24636372, -0.38496333]])注意:如果布爾型數(shù)組的長度不對,布爾型選擇就會出錯,因此一定要小心。
下面的例子,我選取了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]])
~操作符用來反轉(zhuǎn)條件很好用
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]])
選取這三個名字中的兩個需要組合應(yīng)用多個布爾條件,使用&(和)、|(或)之類的布爾算術(shù)運算符即可:
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]])
通過布爾型索引選取數(shù)組中的數(shù)據(jù),將總是創(chuàng)建數(shù)據(jù)的副本,即使返回一模一樣的數(shù)組也是如此。注意:Python關(guān)鍵字and和or在布爾型數(shù)組中無效。要使用&與|。
通過布爾型數(shù)組設(shè)置值是一種經(jīng)常用到的手段。為了將data中的所有負值都設(shè)置為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. ]])
通過一維布爾數(shù)組設(shè)置整行或列的值也很簡單:
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. ]])
后面會看到,這類二維數(shù)據(jù)的操作也可以用pandas方便的來做。
下期我們將分享Numpy的花式索引,如果喜歡請點贊收藏,您的支持是我最大的動力,謝謝大家,共同進步。掃描二維碼關(guān)注全部內(nèi)容
總結(jié)
以上是生活随笔為你收集整理的python布尔系列_python数据分析类库系列-Numpy之布尔型索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 加入debug后可以进入contr
- 下一篇: python正则表达式操作指南_Pyth