numpy索引取值和切片
numpy索引取值和切片
- ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样,索引也是从0开始往后
- 切片有两种方式,下面两种切片方式的区间,冒号两边也遵循左闭右开的规则:
[...)-
- 同列表
[start:end:step]切片类似,ndarray 数组可以基于 0 - n 的索引,使用 "冒号"分隔来切片,且行和列的索引之间用”逗号“分隔,唯一不同的是,此时的start、end可以为一个int数字,也可以为一个列表
- 同列表
-
- 也可以通过内置的
slice(start,end,step)函数进行切片,从原数组中切割出一个新数组
- 也可以通过内置的
-
一、取行
1. 取某一行
- 语法:
ndarrar.[n] 或者 ndarrar.[n,:]- 后面的冒号表示列都要
import numpy as np
a = np.arange(24).reshape(4,6)
print(a)
print(a[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]]
[12 13 14 15 16 17]
"""
2. 取连续多行
-
语法:
ndarrar.[start:end:step] 或者 ndarrar.[start:end:step,:]-
最后的冒号表示所有列都要
-
当需要多行中的每隔几行来取,就要用到
step步长这个参数了
-
import numpy as np
a = np.arange(24).reshape(4,6)
print(a)
print(a[2]) # 取第3行数据
print(a[:2]) # 取 第1行到第2行,[...)与python的列表切片一样,左闭右开的区间
print(a[1:2]) # 取第2行到第2行,左闭右开所以只取到第二行的数据
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[12 13 14 15 16 17]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
[[ 6 7 8 9 10 11]]
"""
3. 取不连续多行
- 语法:
ndarrar.[[m,n,...]] 或者 ndarrar.[[m,n,...],:]- 最后的冒号表示所有列都要
a = np.arange(24).reshape(4,6)
print(a)
print(a[[0,2,3]]) # 取第1行 第3行 第4行
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
"""
二、取列
1. 取某一列
- 语法:
ndarrar.[:,n]- 前面的冒号表示行都要
a = np.arange(24).reshape(4,6)
print(a)
# print(a[2]) # 取第3行数据
print(a[:,3]) # 取第4列数据
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[ 3 9 15 21]
"""
2. 取多列
-
语法:
ndarrar.[:,start:end:step]-
前面的冒号表示所有行都要
-
当需要多列中的每隔几列来取,就要用到
step步长这个参数了
-
a = np.arange(24).reshape(4,6)
print(a)
# print(a[2]) # 取第3行数据
# print(a[:2]) # 取第1行到第2行,[...)与python的列表切片一样,左闭右开的区间
# print(a[1:2]) # 取第2行到第2行,左闭右开所以只取到第二行的数据
print(a[:,3]) # 取第4列数据,值得注意的是,当取出1列切片时,切片变形为1维数组
print(a[:,:3]) # 取第1列到第3列数据
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]]
[ 3 9 15 21]
[[ 0 1 2]
[ 6 7 8]
[12 13 14]
[18 19 20]]
[[ 1 2]
[ 7 8]
[13 14]
[19 20]]
"""
3. 取不连续多列
- 语法:
ndarrar.[:,[m,n,...]]- 前面的冒号表示所有行都要
a = np.arange(24).reshape(4,6)
print(a)
print(a[:,[0,2]]) # 取第1列 第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]]
[[ 0 2]
[ 6 8]
[12 14]
[18 20]]
"""
三、同时取行和列
- 语法:
ndarrar.[start:end:step,start:end:step]
a = np.arange(24).reshape(4,6)
print(a)
print(a[:2,1:3]) # 取第1行到第2行,第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]]
[[1 2]
[7 8]]
"""
四、取点
1. 取某一个点
- 语法:
ndarrar.[m,n,...]- 有几个维度中括号里就填几个值
a = np.arange(24).reshape(4,6)
print(a)
print(a[0,2]) # 取第1行的第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]]
2
"""
2. 取多个不相邻的点
- 语法:
ndarrar.[[m,n,...],[j,k,...],...]- 有几个维度,第1层中括号里就填几个中括号
- 去几个点,最里层中括号里就填几个值
1. 二维数组
a = np.arange(24).reshape(4,6)
print(a)
print(a[[0,2],[1,3]]) # 取(0,1) (2,3) 2个坐标的点
print(a[[0,2,3],[1,3,5]]) # 取(0,1) (2,3) (3,5) 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]]
[ 1 15]
[ 1 15 23]
"""
2. 三位数组
a = np.arange(48).reshape(2,4,6)
print(a)
print(a[[0,1,1],[0,2,1],[1,3,2]]) # 取(0,0,1) (1,2,3) (1,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]]
[[24 25 26 27 28 29]
[30 31 32 33 34 35]
[36 37 38 39 40 41]
[42 43 44 45 46 47]]]
[ 1 39 32]
"""
五、numpy中的布尔索引
- 通过布尔索引,可以实现更为复杂的取值操作,会取出布尔值为true的值
- 比如取出数组中所有小于5的值
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 30)
print(a<3)
print(a[a<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]]
[[ True True True False False False]
[False False False False False False]
[False False False False False False]
[False False False False False False]]
[0 1 2]
"""

浙公网安备 33010602011771号