文章目录

  • 1. 索引
  • 1.1 一维数组
  • 1.2 多维数组
  • 2. 切片
  • 2.1 slice 函数或start:stop:step
  • 2.2 省略号‘...’选择数组的维度
  • 2.2 多维数组切片
  • 2.3 整数数组索引
  • 2.4 布尔索引
  • 2.5 花式索引


1. 索引

获取数组中特定位置元素的过程。与 Python 中 list 的操作一样,ndarray 数组可以基于 0 - n 的下标进行索引。

1.1 一维数组
import numpy as np
a = np.array([9,8,7,6,5])
print(a[2])

输出结果为:

7

1.2 多维数组
import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a)
print(a[1, 2, 3])  # 第2个数组,第3行,第4列的元素
print(a[0, 1, 2])  # 第1个数组,第2行,第3列的元素

输出结果为:

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]


[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

23
6

2. 切片

获取数组元素子集的过程,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。

2.1 slice 函数或start:stop:step
import numpy as np
 
a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]
s = slice(2,7,2)   # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])

#start:stop:step 
b = a[2:7:2]       # 从索引 2 开始到索引 7 停止,间隔为2
print(b)

#如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。
#如果为 [2:],表示从该索引开始以后的所有项都将被提取。
#如果使用了两个参数,如 [2:5],那么则提取两个索引(不包括停止索引)之间的项
print(a[2:5])

输出结果为:

[2 4 6]
[2 4 6]
[2 3 4]

2.2 省略号‘…’选择数组的维度
import numpy as np
 
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print(a[1:])       # 从某个索引处开始切割

print (a[...,1])   # 第2列元素
print (a[1,...])   # 第2行元素

输出结果为:

[[3 4 5]
[4 5 6]]

[2 4 5]
[3 4 5]

2.2 多维数组切片
import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a)
print(a[:, 1, -3])  # 全部数组,第2行,倒数第3的元素

输出结果为:

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

[ 5 17]

指定行切片:

import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a[:, 1:3, :])  # 全部数组,第2、3行,所有列的元素
print(a[:, :, ::2])  # 全部数组,所有行,步长为2的元素

输出结果为:

[[[ 4 5 6 7]
[ 8 9 10 11]]
[[16 17 18 19]
[20 21 22 23]]]

[[[ 0 2]
[ 4 6]
[ 8 10]]
[[12 14]
[16 18]
[20 22]]]

2.3 整数数组索引

以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素

import numpy as np 
 
x = np.array([[1,  2],  [3,  4],  [5,  6]]) 
y = x[[0,1,2],  [0,1,0]]  
print (y)

输出结果为:
[1  4  5]

以下实例获取了 4X3 数组中的四个角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print (x)
print ('\n')

#相当于直接找 x[[0, 0, 3, 3],[0, 2, 0, 2]
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
y = x[rows,cols]  
print  ('这个数组的四个角元素是:')
print (y)

输出结果为:

[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这个数组的四个角元素是:
[[ 0 2]
[ 9 11]]

2.4 布尔索引

我们可以通过一个布尔数组来索引目标数组。

布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('我们的数组是:')
print (x)
print ('\n')
# 获取大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x >  5])

我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]


大于 5 的元素是:
[ 6 7 8 9 10 11]

2.5 花式索引

花式索引指的是利用整数数组进行索引。

花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

花式索引跟切片不一样,它总是将数据复制到新数组中。

2.5.1 传入顺序索引数组

import numpy as np 
 
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])

输出结果为:

[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]

2.5.2 传入倒序索引数组

import numpy as np 
 
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])

输出结果为:

[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]

2.5.3 传入多个索引数组(要使用np.ix_)

import numpy as np 
 
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
#如果 np.xi_ 中输入两个列表,则第一个列表存的是待提取元素的行标
#第二个列表存的是待提取元素的列标。

输出结果为:

[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]

索引教程