Python str、list、numpy分片操作(2)

>>> 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.]])

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9bac84459a536169e2d968c3061b3082.html