一起學數據分析之NumPy(06)——布爾索引

<code>import numpy as np
/<code>

我們來看這樣一個例子,假設我們有一個存儲數據的數組data,以及一個存儲姓名的數組names(含有重複項)。

In [8]:

<code>names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
names
/<code>

Out[8]:

<code>array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='/<code>

In [26]:

<code>from numpy.random import randn
data = randn(7,4)
data
/<code>

Out[26]:

<code>array([[-0.17984368,  0.659306  , -1.55608245, -0.08778296],
       [ 0.63521652, -1.11252713,  0.36911194, -0.7974335 ],
       [-0.85799746, -1.20666234,  0.56948933,  1.95995853],
       [-0.3604681 ,  0.84080015, -0.38852835, -0.81282702],
       [-1.24698793, -0.02733547, -0.74378104,  0.56393173],
       [-1.36475413, -0.52779077,  0.75193914,  0.0217323 ],
       [ 0.27691141, -0.07244937,  0.9796854 ,  0.53271609]])/<code>

假設每個名字都對應data數組中的一行,而我們想要選出對應於名字“Bob”的所有行。跟算術運算一樣,數組的比較運算(如==)也是矢量化的。因此,對names和字符串“Bob”的比較運算將會產生一個布爾數組:

In [27]:

<code>names == 'Bob'
/<code>

Out[27]:

<code>array([ True, False, False,  True, False, False, False])/<code>

這個布爾型數組可用於數組索引:

In [28]:

<code>data[names == 'Bob']
/<code>

Out[28]:

<code>array([[-0.17984368,  0.659306  , -1.55608245, -0.08778296],
       [-0.3604681 ,  0.84080015, -0.38852835, -0.81282702]])/<code>

布爾型數組的長度必須跟被索引的軸長度一致。 我們可以將布爾型數組跟切片、整數(或整數序列)混合使用:

In [29]:

<code>data[names == 'Bob', 2:]
/<code>

Out[29]:

<code>array([[-1.55608245, -0.08778296],
       [-0.38852835, -0.81282702]])/<code>

In [30]:

<code>data[names == 'Bob', 3]
/<code>

Out[30]:

<code>array([-0.08778296, -0.81282702])/<code>

要選擇出“Bob”以外的其他值,既可以使用不等於符號(!=),也可以通過“~”符號對條件進行否定:

In [31]:

<code>names != 'Bob'
/<code>

Out[31]:

<code>array([False,  True,  True, False,  True,  True,  True])/<code>

In [32]:

<code>data[names != 'Bob']
/<code>

Out[32]:

<code>array([[ 0.63521652, -1.11252713,  0.36911194, -0.7974335 ],
       [-0.85799746, -1.20666234,  0.56948933,  1.95995853],
       [-1.24698793, -0.02733547, -0.74378104,  0.56393173],
       [-1.36475413, -0.52779077,  0.75193914,  0.0217323 ],
       [ 0.27691141, -0.07244937,  0.9796854 ,  0.53271609]])/<code>

In [33]:

<code>data[~(names == 'Bob')]
/<code>

Out[33]:

<code>array([[ 0.63521652, -1.11252713,  0.36911194, -0.7974335 ],
       [-0.85799746, -1.20666234,  0.56948933,  1.95995853],
       [-1.24698793, -0.02733547, -0.74378104,  0.56393173],
       [-1.36475413, -0.52779077,  0.75193914,  0.0217323 ],
       [ 0.27691141, -0.07244937,  0.9796854 ,  0.53271609]])/<code>

選取這三個名字中的兩個需要組合應用多個布爾條件,使用&(和)、|(或)之類的布爾運算符即可,不能使用Python的and和or關鍵字:

In [35]:

<code>mask = (names == 'Bob')|(names == 'Will')
mask
/<code>

Out[35]:

<code>array([ True, False,  True,  True,  True, False, False])/<code>

In [36]:

<code>data[mask]
/<code>

Out[36]:

<code>array([[-0.17984368,  0.659306  , -1.55608245, -0.08778296],
       [-0.85799746, -1.20666234,  0.56948933,  1.95995853],
       [-0.3604681 ,  0.84080015, -0.38852835, -0.81282702],
       [-1.24698793, -0.02733547, -0.74378104,  0.56393173]])/<code>

通過布爾型所以選取數組中的數據,將會創建數據的副本,即使返回一模一樣的數組也是。 通過布爾型數組設置值也是一種經常用到的手段。為了將data種的所有負值都設置為0,我們只需要:

In [38]:

<code>data[data<0] = 0
data
/<code>

Out[38]:

<code>array([[0.        , 0.659306  , 0.        , 0.        ],
       [0.63521652, 0.        , 0.36911194, 0.        ],
       [0.        , 0.        , 0.56948933, 1.95995853],
       [0.        , 0.84080015, 0.        , 0.        ],
       [0.        , 0.        , 0.        , 0.56393173],
       [0.        , 0.        , 0.75193914, 0.0217323 ],
       [0.27691141, 0.        , 0.9796854 , 0.53271609]])/<code>

通過一維布爾數組設置整行或列的值也很簡單:

In [39]:

<code>data[names != 'Joe'] = 10
data
/<code>

Out[39]:

<code>array([[10.        , 10.        , 10.        , 10.        ],
       [ 0.63521652,  0.        ,  0.36911194,  0.        ],
       [10.        , 10.        , 10.        , 10.        ],
       [10.        , 10.        , 10.        , 10.        ],
       [10.        , 10.        , 10.        , 10.        ],
       [ 0.        ,  0.        ,  0.75193914,  0.0217323 ],
       [ 0.27691141,  0.        ,  0.9796854 ,  0.53271609]])/<code>


分享到:


相關文章: