索引和切片
- 数组切片是原始数组的视图,不是复制品,如果要得到切片的副本,应该使用 copy()方法
- 在多维数组中索引,如果省略了后面的索引,则返回对象会是一个维度低一点的 ndarray(它含有高一级维度上的所有数据)
# 切片
切片的基本语法 ndarray[i : j : k],其中 i 为起始下标,j 为结束下标(不包括 j),k 为步长(默认为 1)
import numpy as np
arr = np.arange(10)
arr
1
2
3
4
2
3
4
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[1:9:2]
1
array([1, 3, 5, 7])
arr[4:-3]
1
array([4, 5, 6])
arr[9:4:-2]
1
array([9, 7, 5])
a = arr[::2]
a
1
2
2
array([0, 2, 4, 6, 8])
arr[:6] = 0
1
arr[6:]
1
array([6, 7, 8, 9])
arr[:] = 1
arr
1
2
2
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
多维切片
ndarr = np.arange(16).reshape((4, 4))
ndarr
1
2
2
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
ndarr[:2] # 行,等效于arr2[:2, :]
1
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
ndarr[:2, :2] # 前两行的前两列
1
array([[0, 1],
[4, 5]])
ndarr[::2, -2] # 步长为2的行的倒数第二列
1
array([ 2, 10])
# 索引
arr = np.arange(10)
ndarr = np.arange(16).reshape((4, 4))
arr
ndarr
1
2
3
4
2
3
4
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
arr[1]
1
1
ndarr[1,1]
1
5
ndarr[1, 1] # 等效于ndarr[1][1],但是后者速度更慢
1
5
ndarr[2, [1, 2]] # 第2行的第1、2列元素
1
array([ 9, 10])
ndarr[:3, [0,1]] # 前3行的第0、1列元素
1
array([[0, 1],
[4, 5],
[8, 9]])
# 布尔索引
cities = np.array(['bj', 'cd', 'sh', 'gz', 'cd'])
cities
1
2
2
array(['bj', 'cd', 'sh', 'gz', 'cd'], dtype='<U2')
data = np.arange(20).reshape(5, 4)
data
1
2
2
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
cities == 'cd'
1
array([False, True, False, False, True])
data[cities == 'cd']
1
array([[ 4, 5, 6, 7],
[16, 17, 18, 19]])
data[cities == 'cd', :1]
1
array([[ 4],
[16]])
# data[:, cities=='cd'] # 注意:如果布尔型数组的长度不对,布尔型选择就会出错
1
还可以这样?
cities != 'cd'
1
array([ True, False, True, True, False])
data[cities != 'cd'] # 等效于 data[~(cities == 'cd')]
1
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
data[cities != 'cd', :1] # 等效于 data[~(cities == 'cd'), :1]
1
array([[ 0],
[ 8],
[12]])
# 花式索引
花式指的是利用整数数组进行索引
arr3 = np.arange(36).reshape(6,6)
arr3
1
2
2
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
# 取出第3,2, 5行
arr3[[3, 4, 5]]
1
2
2
array([[18, 19, 20, 21, 22, 23],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
# 使用负数索引将会从末尾开始选取行
arr3[[-4, -2 , -1]]
1
2
2
array([[12, 13, 14, 15, 16, 17],
[24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35]])
arr3[[1, 2, 3], [1, 2, 3]] # 取出下标为(1, 1), (2, 2), (3, 3)的元素
1
array([ 7, 14, 21])
arr3[[1, 2, 3]][:, [1, 2, 3]] # 同时在行和列上进行花式索引
1
array([[ 7, 8, 9],
[13, 14, 15],
[19, 20, 21]])
上次更新: 2023/11/01, 03:11:44