Numpy数据中的行切片、列切片以及行列结合的数据切片方法及具体代码举例
Numpy中对数据进行切片读取是一项基本且重要的技能,上次通过博文:使用NumPy工具包生成一维、二维以及多维数组方法和具体举例介绍了使用NumPy工具包生成一维、二维以及多维数组方法和具体举例。本文将通过程序和运行验证,来熟悉对Numpy数据中的行切片、列切片以及行列结合的数据切片方法及具体代码举例。
〇、数据准备
0.1 一个五行五列array数据A的准备
import numpy as np
A=np.array([[21,53,78,90,10],[16,65,29,-6,186],[9,898,7,349,2],[82,62,5,48,3],[857,595,76,522,341]])
print(A)
运行结果:
[[ 21 53 78 90 10]
[ 16 65 29 -6 186]
[ 9 898 7 349 2]
[ 82 62 5 48 3]
[857 595 76 522 341]]
0.2 一个四行五列array数据B的准备
B=np.arange(1,21,1).reshape(4,5)
print(B)
运行结果:
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
一、行数据切片
1.1、单行数据切片方法举例
(1) 任意一行数据切片
#获取第0行数据
A[0,:]
运行结果:
array([21, 53, 78, 90, 10])
#第4行数据
A[4,:]
运行结果:
array([857, 595, 76, 522, 341])
(2)从尾行往回切的单行切片
A[-1,:] #最后一行数据切片
运行结果:
array([857, 595, 76, 522, 341])
A[-2,:] #最后第二行数据切片
运行结果:
array([82, 62, 5, 48, 3])
1.2、多行数据切片方法举例
(1) 任意多行数据的切片
A[(0,3,4),:] #注意要使用圆括号将多个行号括起来
运行结果:
array([[ 21, 53, 78, 90, 10],
[ 82, 62, 5, 48, 3],
[857, 595, 76, 522, 341]])
(2) 连续多行数据的切片
A[1:4,:]
运行结果:
array([[ 16, 65, 29, -6, 186],
[ 9, 898, 7, 349, 2],
[ 82, 62, 5, 48, 3]])
(3)等间隔多行数据的切片
(a) 从头行开始的,所有行的等间隔多行数据的切片
A[::2,:] #本例中等价于A[0::2,:]
运行结果:
array([[ 21, 53, 78, 90, 10],
[ 9, 898, 7, 349, 2],
[857, 595, 76, 522, 341]])
A[0::2,:]
运行结果:
array([[ 21, 53, 78, 90, 10],
[ 9, 898, 7, 349, 2],
[857, 595, 76, 522, 341]])
(b)从尾行开始的,所有行的等间隔多行数据的切片
A[::-2,:] #负号表示反方向 ,本例中等价于A[-1::-2,:]
运行结果:
array([[857, 595, 76, 522, 341],
[ 9, 898, 7, 349, 2],
[ 21, 53, 78, 90, 10]])
A[-1::-2,:]
运行结果:
array([[857, 595, 76, 522, 341],
[ 9, 898, 7, 349, 2],
[ 21, 53, 78, 90, 10]])
©从指定行开始正向等间隔多行数据的切片
A[1::2,:]
运行结果:
array([[ 16, 65, 29, -6, 186],
[ 82, 62, 5, 48, 3]])
(d)从指定行开始反向等间隔多行数据的切片
A[4::-2,:] #负号表示反方向
运行结果:
array([[857, 595, 76, 522, 341],
[ 9, 898, 7, 349, 2],
[ 21, 53, 78, 90, 10]])
二、列数据切片
2.1、单列数据切片方法举例
(1) 任意一列数据切片
#获取第2列数据
A[:,2]
运行结果:
array([78, 29, 7, 5, 76])
(2) 从尾列往回切的单个列数据切片
A[:,-1] #最后一列数据
运行结果:
array([ 10, 186, 2, 3, 341])
A[:,-2] #最后第二列数据
运行结果:
array([ 90, -6, 349, 48, 522])
2.2、多列数据切片方法举例
(1) 任意多列数据的切片
A[:,(0,1,4)] #注意要使用圆括号将多个列号括起来
运行结果:
array([[ 21, 53, 10],
[ 16, 65, 186],
[ 9, 898, 2],
[ 82, 62, 3],
[857, 595, 341]])
(2) 连续多列数据的切片
A[:,1:4]
运行结果:
array([[ 53, 78, 90],
[ 65, 29, -6],
[898, 7, 349],
[ 62, 5, 48],
[595, 76, 522]])
(3)等间隔多列数据的切片
(a) 从头列开始的,所有列的等间隔多列数据的切片
A[:,::2] #本例等价于A[:,0::2]
运行结果:
array([[ 21, 78, 10],
[ 16, 29, 186],
[ 9, 7, 2],
[ 82, 5, 3],
[857, 76, 341]])
A[:,0::2]
运行结果:
array([[ 21, 78, 10],
[ 16, 29, 186],
[ 9, 7, 2],
[ 82, 5, 3],
[857, 76, 341]])
(b) 从尾列开始的往回,所有列的等间隔多列数据的切片
A[:,::-2] #从最后一列开始,本例等价于A[:,-1::-2] ,例如下面的计算结果
运行结果:
array([[ 10, 78, 21],
[186, 29, 16],
[ 2, 7, 9],
[ 3, 5, 82],
[341, 76, 857]])
A[:,-1::-2] #负号表示反方向
运行结果:
array([[ 10, 78, 21],
[186, 29, 16],
[ 2, 7, 9],
[ 3, 5, 82],
[341, 76, 857]])
©从指定列开始到指定列止,正向等间隔多列数据的切片
A[:,1:4:2] #从标号为1的列开始,到标号为4的列止,每隔2切片
运行结果:
array([[ 53, 90],
[ 65, -6],
[898, 349],
[ 62, 48],
[595, 522]])
(d)从指定列开始反向到指定列止,等间隔多列数据的切片
A[:,-2:0:-2] #从最后第二列开始往回切,到标号为0的列止 本例A数据的情景下等价于A[:,3::-2] 例如下面的计算结果
运行结果:
array([[ 90, 53],
[ -6, 65],
[349, 898],
[ 48, 62],
[522, 595]])
A[:,3::-2]
运行结果:
array([[ 90, 53],
[ -6, 65],
[349, 898],
[ 48, 62],
[522, 595]])
三、行与列结合的数据切片
import numpy as np
A=np.array([[21,53,78,90,10],[16,65,29,-6,186],[9,898,7,349,2],[82,62,5,48,3],[857,595,76,522,341]])
print(A)
运行结果:
[[ 21 53 78 90 10]
[ 16 65 29 -6 186]
[ 9 898 7 349 2]
[ 82 62 5 48 3]
[857 595 76 522 341]]
3.1 对于单个数据切片
A[0,0]
运行结果:
np.int64(21)
A[2,4]
运行结果:
np.int64(2)
3.2 对于单行,多列数据切片
A[2,(0,1,3,4)]
运行结果:
array([ 9, 898, 349, 2])
3.3 对于单列,多行数据切片
A[(2,3,4),3]
运行结果:
array([349, 48, 522])
3.4 对于多列,多行数据切片
(1)行或列的等间隔切片
例子1:
A[(2,3,4),1:3:1] # 本例中等价于A[(2,3,4),1:3] 或者A[2:5:1,1:3]
运行结果:
array([[898, 7],
[ 62, 5],
[595, 76]])
A[(2,3,4),1:3]
运行结果:
array([[898, 7],
[ 62, 5],
[595, 76]])
A[2:5:1,1:3]
运行结果:
array([[898, 7],
[ 62, 5],
[595, 76]])
例子2:
A[:,0:3:2] #从标号为0的列,到标号为3的列,之间每个2切片
运行结果:
array([[ 21, 78],
[ 16, 29],
[ 9, 7],
[ 82, 5],
[857, 76]])
(2)行和列的非等间隔切片
例子1:从B中切出array([[ 7, 9, 10],[17, 19, 20]]),如下图所示的位置的数。
B=np.arange(1,21,1).reshape(4,5)
B
运行结果:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
B[(1,3),:][:,(1,3,4)] #采用先切出行,再切出列的分步切法,而不能使用B[(1,3),(1,3,4)],否则会出错。
运行结果:
array([[ 7, 9, 10],
[17, 19, 20]])
注意:不能使用B[(1,3),(1,3,4)]代替B[(1,3),:][:,(1,3,4)]进行切片 ,否则会出错。
四、总结
Numpy中对数据进行切片读取是一项基本且重要的技能,本文通过程序和运行验证,对Numpy数据中的行切片、列切片以及行列结合的数据切片方法及具体代码举例,便于在今后的Numpy数据应用中熟练对数据进行灵活切片使用。