>>> import numpy as np
>>> from numpy.random import randint
>>> names = np.array(['Bob', 'Joe', 'Bob', 'Will', 'Will', 'Joe', 'Joe', 'Bob'])
>>> data = randint(6, size=(8, 4))
>>> data
array([[2, 1, 2, 2],
[3, 3, 4, 2],
[0, 5, 3, 5],
[2, 1, 5, 2],
[1, 3, 0, 3],
[0, 0, 0, 1],
[0, 0, 0, 5],
[4, 2, 5, 1]])
假设每个名字都对应data数组中的一行,而我们想要选出对应于名字“Bob”的所有行。我们可以这样操作
>>> names == 'Bob'
array([ True, False, True, False, False, False, False, True], dtype=bool)
>>> data[names == 'Bob']
array([[2, 1, 2, 2],
[0, 5, 3, 5],
[4, 2, 5, 1]])
布尔型数组的长度必须跟被索引的数组长度一致,此外,还可以将布尔型数组跟分片、整数(或整数序列)混合使用
>>> data[names == 'Bob', 2:]
array([[2, 2],
[3, 5],
[5, 1]])
>>> data[names == 'Bob', 3]
array([2, 5, 1])
>>> data[names == 'Bob', 3:]
array([[2],
[5],
[1]])
如果需要选取多个名字组合需要组合多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符即可:
>>> mask = (names == 'Bob') | (names == 'Will')
>>> mask
array([ True, False, True, True, True, False, False, True], dtype=bool)
>>> data[mask]
array([[2, 1, 2, 2],
[0, 5, 3, 5],
[2, 1, 5, 2],
[1, 3, 0, 3],
[4, 2, 5, 1]])
注意:Python关键字and和or在布尔型数据中无效
通过布尔型数组设置值是一种经常用到的手段,为了将data中所有的偶数设置为3,我们只需:
>>> data
array([[2, 1, 2, 2],
[3, 3, 4, 2],
[0, 5, 3, 5],
[2, 1, 5, 2],
[1, 3, 0, 3],
[0, 0, 0, 1],
[0, 0, 0, 5],
[4, 2, 5, 1]])
>>> data[data % 2 == 0] = 3
>>> data
array([[3, 1, 3, 3],
[3, 3, 3, 3],
[3, 5, 3, 5],
[3, 1, 5, 3],
[1, 3, 3, 3],
[3, 3, 3, 1],
[3, 3, 3, 5],
[3, 3, 5, 1]])
花式索引
花式索引是numpy术语,它指的是利用整数数组进行索引。假设我们有一个8×4数组:
>>> arr = np.empty((8, 4))
>>> for i in range(8):
... arr[i] = i
...
>>> arr
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
>>> arr[[3, 5, 0, 6]]
array([[ 3., 3., 3., 3.],
[ 5., 5., 5., 5.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
>>> arr[[3, -3, -1]]
array([[ 3., 3., 3., 3.],
[ 5., 5., 5., 5.],
[ 7., 7., 7., 7.]])