Day 04-数组索引-灵析社区

野生程序员在线

本节内容:

1、基本切片和索引

2、数组索引

3、布尔数组索引

4、缺省索引

5、索引数组与切片结合

1、基本切片和索引

基本切片(Basic slicing)将 Python 的基本概念扩展到 N 个维。 当 obj 是一个切片对象(由方括号内的 start:stop:step 表示法构造),整数或切片对象和整数的元组时,会产生切片操作。

1.1、单元素索引

单元素索引的工作方式与其他标准 Python 序列的工作方式完全相同。它是基于 0 的,并接受从数组末尾开始索引的负索引

x = np.arange(10)
print(x)
x[2]
# 2
x[-2]
# 8

x.shape = (2, 5)  # 现在x是二维的
x
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''
x[1, 3]
# 8
x[1, -1]
# 9

x[0]
# array([0, 1, 2, 3, 4])

x[0][2]
# 2

1.2、切片和跨步

1)基本的切片语法是 i:j:k,其中 i 是起始索引,j 是停止索引,k是步骤:

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[1:7:2]
# array([1, 3, 5])

2)负 i 和 j 被解释为 n+i 和 n+j,其中 n 是相应维度中的元素数。负k使步进指数变小。根据上述示例:

x[-2:10]
# array([8, 9])
x[-3:3:-1]
# array([7, 6, 5, 4])

3)假设n是要切片的维度中的元素数。然后,如果没有给i,k>0 时默认为0,k<0 时默认为 n-1。如果未给定j,则k>0时默认为n,k<0时默认为-n-1。如果未指定k,则默认为1。注意 ::: 相同,表示选择沿该轴的所有索引

x[5:]
# array([5, 6, 7, 8, 9])

4)如果选择元组中的对象数小于 N,则 : 假定后继的任意维。例如:

x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
x.shape
# (2, 3, 1)
x[1:2]
'''
array([[[4],
        [5],
        [6]]])
'''

2、数组索引

整数数组索引允许根据数组中的任意项的 N 维索引来选择它们。每个整数数组表示该维度中的多个索引。

索引数组中允许出现负值,并且与处理单个索引或切片时一样

x = np.arange(10, 1, -1)
x
# array([10,  9,  8,  7,  6,  5,  4,  3,  2])
x[np.array([3, 3, 1, 8])]
# array([7, 7, 9, 2])
x[np.array([3, 3, -3, 8])]
# array([7, 7, 4, 2])

如果索引值超出界限,则引发 IndexError:

x = np.array([[1, 2], [3, 4], [5, 6]])
x[np.array([1, -1])]
'''
array([[3, 4],
      [5, 6]])
'''

x[np.array([3, 4])]
'''
Traceback (most recent call last):
  ...
IndexError: index 3 is out of bounds for axis 0 with size 3
'''

3、布尔数组索引

当obj是布尔类型的数组对象(可能从比较运算返回)时,会发生这种高级索引

案例:可能希望从非NaN的数组中选择所有条目:

x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
x[~np.isnan(x)]
# array([1., 2., 3.])

或者希望为所有负元素添加一个常量:

x = np.array([1., -1., -2., 3])
x[x < 0] += 20
x
# array([ 1., 19., 18., 3.])

x = np.arange(35).reshape(5, 7)
b = x > 20
b[:, 5]
# array([False, False, False,  True,  True])
x[b[:, 5]]
'''
array([[21, 22, 23, 24, 25, 26, 27],
      [28, 29, 30, 31, 32, 33, 34]])
'''

4、缺省索引

不完全索引是从多维数组的第一个维度获取索引或切片的一种方便方法

a = np.arange(0, 100, 10)
b = a[:5]
c = a[a >= 50]
print(b) # >>>[ 0 10 20 30 40]
print(c) # >>>[50 60 70 80 90]

5、索引数组与切片结合

索引数组可以与切片组合。例如:

>>> y[np.array([0, 2, 4]), 1:3]
array([[ 1,  2],
       [15, 16],
       [29, 30]])

实际上,切片和索引数组操作是独立的。切片操作提取索引为 1 和 2 的列(即第 2 和第 3 列),然后是索引数组操作提取索引为 0、2 和 4 的行(即第一、第三和第五行)。

阅读量:1113

点赞量:0

收藏量:0