numpy数组的列表索引与布尔索引
使用numpy数组时经常会用到列表索引与布尔索引,以此为计算提供便利和捷径。
题设
有如下矩阵:
import numpy as np
a = np.array(
[[0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43],
[50, 51, 52, 53]]
)
列表索引
用列表索引numpy数组:
1.单维索引取全部
# 用列表去索引numpy数组,只在一个维度索引,其余维度的值都取
a_0 = [0, 2, 4]
print(a[a_0, ...]) # 索引第0 2 4 行,全部列的元素
'''
打印输出:
[[ 0 1 2 3]
[20 21 22 23]
[40 41 42 43]]
'''
a_1 = [1, 3]
print(a[..., a_1]) # 索引第1 3 列,全部行的元素
'''
打印输出:
[[ 1 3]
[11 13]
[21 23]
[31 33]
[41 43]
[51 53]]
'''
2.多维索引形相同
# 在多个维度索引,每个维度的索引列表形状要相同
a_2 = [1, 2]
a_3 = [1, 2]
print(a[a_2,a_3]) # 索引多个维度,形状要相同
'''
取第一行第一列的元素是a[1,1]
取第二行第二列的元素是a[2,2]
那么,a[[1,2],[1,2]]是取什么?
答:先取第一行第一列,再去第二行第二列,一共两个数。
打印输出:
[11 22]
'''
# 如果想取第一、二行的第一、二列的元素怎么办呢:
print(a[1:3,1:3])
'''
打印输出:
[[11 12]
[21 22]]
公式:numpy.ndarray[start:end:step, start:end:step] 左闭右开(包含start不包含end),step为步长,步长为1可以省略
'''
布尔索引
常见的两种情况:索引首个维度与对应位置索引
- 索引首个维度
# 布尔索引
# 1. 首个维度
t = [True, False, False, False, False, True]
print(a[t, ...])
'''
索引首个维度,索引第二个维度会出错
打印输出:
[[ 0 1 2 3]
[50 51 52 53]]
'''
- 对应位置索引
# 2. 对应索引
t = np.array(
[[False, True, True, True],
[True, True, True, True],
[True, True, True, True],
[True, True, True, True],
[True, True, True, True],
[True, True, True, False]]
)
print(a[t])
'''
数组的每个位置都对应一个布尔值,返回的结果会被排成一行。
打印输出:
[ 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 50 51 52] 首尾两个值未被索引到
'''