类似于list切片和索引一样,ndarray对象也可以通过索引或切片进行操作。
以下展示了两种不同切片方式
arr = np.arange(10)
# 从索引 2 开始到索引 7 停止,间隔为2
arr1 = arr[slice(2,7,2)]
arr2 = arr[2:7:2]
print('arr1:{0}\narr2:{1}'.format(arr1,arr2))
arr1:[2 4 6]
arr2:[2 4 6]
:
切片numpy中出上文中介绍的切片方式外,可以通过:
操作对数组进行任意方式的切片,十分的灵活。
arr = np.arange(10) #[0 1 2 3 4 5 6 7 8 9]
arr1 = arr[3] #第4个元素
print('arr1:{0}'.format(arr1))
arr2 = arr[2:] #从第3个往后的元素
print('arr2:{0}'.format(arr2))
arr3 = arr[2:6] #第3个至第7个元素
print('arr3:{0}'.format(arr3))
arr1:3
arr2:[2 3 4 5 6 7 8 9]
arr3:[2 3 4 5]
可以使用省略号 …
可以选择与数组的维度相同的数据,该方法与使用:
作用相同
arr = np.arange(12) .reshape(3,4) ## array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
print(arr[...,1]) # 第2列元素
print(arr[...,1]==arr[:,1])
print(arr[1,...]) # 第2行元素
print(arr[1,...]==arr[1,:])
print(arr[...,1:]) # 第2列及剩下的所有元素
print(arr[...,1:]==arr[:,1:])
[1 5 9]
[ True True True]
[4 5 6 7]
[ True True True True]
[[ 1 2 3]
[ 5 6 7]
[ 9 10 11]]
[[ True True True]
[ True True True]
[ True True True]]
介绍[-1]、[:-1]、[::-1]、[2::-1]表达的意义
arr = np.arange(10) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[-1]) ## 最后一个元素: 9
print(arr[-3]) ## 从后面数第3个元素:7
print(arr[:-1]) ## 截止到最后一个数:[0 1 2 3 4 5 6 7 8]
print(arr[:-3]) ## 截止到最后3个数:[0 1 2 3 4 5 6]
print(arr[::-1]) ## 对数组进行倒序:[9 8 7 6 5 4 3 2 1 0]
print(arr[2::-1]) ## 取从下标为2的元素翻转读取:[2 1 0]
::
前面的值为初始取数的下标,后面的值为步长,正负符号表示正向和反向
print(arr[5::2]) ## 从下标为5的数,往后每隔2个导出:[5 7 9]
print(arr[5::-3]) ##从下标为5的数,从后往前每隔3个数: [5 2]
print(arr[::-3]) ## 从后往前每隔3个数: [9 6 3 0]
根据行索引和列索引取数
arr = np.arange(12) .reshape(4,3) ##array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
##获取数组中(0,2),(1,1),(3,2)和(2,2)位置处的元素
arr1 = arr[[0,1,3,2],[2,1,2,2]] ##array([ 2, 4, 11, 8])
##行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2],得到的是一个二维数组
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
arr2 = arr[rows,cols] #array([[ 0, 2], [ 9, 11]])
##分别对行列进行分割
arr3 = arr[1:3, 1:3] #array([[4, 5], [7, 8]]),
arr4 = arr[:,[1,2]] # array([[ 1, 2], [ 4, 5], [ 7, 8], [10, 11]]))
通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组
arr = np.arange(12) .reshape(4,3) ##array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
##计算arr中大于5的数
print(arr>5) ## [[False False False] [False False False] [ True True True] [ True True True]]
print(arr[arr>5]) ## [ 6 7 8 9 10 11]
##计算arr中不等于5的数
print(arr[arr!=5]) ## [ 0 1 2 3 4 6 7 8 9 10 11]
花式索引指的是利用整数数组进行索引
根据索引数组的值作为目标数组的某个轴的下标来取值。
花式索引跟切片不一样,它总是将数据复制到新数组中
arr = np.arange(20).reshape((5,4))#[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]]
## 从0行计,取第4,2,1行
arr1 = arr[[4,2,1]] ##[[16, 17, 18, 19],[ 8, 9, 10, 11],[ 4, 5, 6, 7]]
## 倒序,最后一行序号-1,依次取第-4,-2,-1行
arr2 = arr[[-4,-2,-1]] ##[[ 4, 5, 6, 7], [12, 13, 14, 15], [16, 17, 18, 19]]
传入多个索引数组,需要使用np.ix_
np.ix_函数,能把两个一维数组转换为一个用于选取方形区域的索引器,先按第一个数组序号选取行,再选取第二个数组中对应的列
arr3 = arr[[1,2,3],[2,1,1]] # [ 6, 9, 13]
idx = np.ix_([1,2,3],[2,1,3]) #array([[1],[2],[3]]), array([[2, 1, 3]])
arr4 = arr[idx] # [[ 6, 5, 7], [10, 9, 11], [14, 13, 15]]