详细解释numpy库中slice切片用法 0,1,None

详解numpy库中切片用法 0,1,None

前言

在图像处理中,常常会对矩阵进行切片操作,例如,通过切片操作拿出ROI区域,或者做一些变换。

常规切片用法

[1:3]取矩阵的[1,3)的第一行和第二行

import numpy as np

arr1 = np.arange(40)
arr1 = arr1.reshape(5, 8)
print(arr1)
print('####################################')
arr2 = arr1[1:3]
print(arr2)

结果
[[ 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]]
####################################
[[ 8 9 10 11 12 13 14 15]
[16 17 18 19 20 21 22 23]]

[:, 2:3]:取矩阵的第二列

arr3 = arr1[:, 2:3]
print(arr3)

结果
####################################
[[ 2]
[10]
[18]
[26]
[34]]

[1:3, 2:3]:对矩阵的行row取[1, 3)(包含第一行,不包含第3行);对矩阵的列col取[2, 3)

arr4 = arr1[1:3, 2:3]

结果
####################################
[[10]
[18]]

特殊切片用法

取除了第0行以外的所有元素:arr[1:None, :]

import numpy as np

arr1 = np.arange(40)
arr1 = arr1.reshape(5, 8)
print(arr1)
print('###############################')
a1 = arr1[1:None, :]
print(a1)

结果
[[ 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]]
###############################
[[ 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]]

取除了第0列以外的所有元素:arr[:, 1:None]

a2 = arr1[:, 1:None]
print(a2)

结果
###############################
[[ 1 2 3 4 5 6 7]
[ 9 10 11 12 13 14 15]
[17 18 19 20 21 22 23]
[25 26 27 28 29 30 31]
[33 34 35 36 37 38 39]]

取除了最后一行的所有元素: arr[0:-1, :]

a3 = arr1[0:-1,:]
print(a3)

结果
[[ 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]]

取除了最后一列的所有元素: arr[:, 0:-1]

a4 = arr1[:, 0:-1]
print(a4)

结果
###############################
[[ 0 1 2 3 4 5 6]
[ 8 9 10 11 12 13 14]
[16 17 18 19 20 21 22]
[24 25 26 27 28 29 30]
[32 33 34 35 36 37 38]]

取除了最后一行最后一列的所有元素:arr[0:-1, 0:-1]

a5 = arr1[0:-1, 0:-1]
print(a5)

结果
###############################
[[ 0 1 2 3 4 5 6]
[ 8 9 10 11 12 13 14]
[16 17 18 19 20 21 22]
[24 25 26 27 28 29 30]]

取除了第一行第一列的所有元素: arr[1:None, 1:None]

a6 = arr1[1:None, 1:None]
print(a6)

结果
###############################
[[ 9 10 11 12 13 14 15]
[17 18 19 20 21 22 23]
[25 26 27 28 29 30 31]
[33 34 35 36 37 38 39]]

numpy中的切片可以用于等号的左边

在其他语言中,切片一般不能用于等号的左边,但是numpy库很强大,可以用于等式的左边

brr = np.zeros(arr1.shape)
brr[0:-1, :] = arr1[1:None, :]
print(brr)

arr1:
[[ 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]]

brr:
[[ 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.]
[ 0. 0. 0. 0. 0. 0. 0. 0.]]

总结

arr1[row, col] 切片是这种形式
如果是仅取某几列,那么row用“”冒号,即arr1[:, col1:col2],从col1列开始,直到col2列结束,不包含col2列,同理,如果仅取某几行,那么col用“”冒号代替
-1表示最后一行,或一列
None表示能取到最后一行或一列

你可能感兴趣的:(python,python,切片,slice,None,-1)