Python矩阵切片(快捷操作)

时间:2021-09-23 01:31:35

最近在看代码过程中看到如下表达式(其中W是2*2*2*3的举证):

W = W[...,::-1,::-1]

这是numpy矩阵按维度进行操作,里面包含了两个功能:

1、[...]

这个省略号其实就是省略号,它的左边从左往右表示从第1维开始执行对应操作,右边从右往左表示从最后一维开始做对应操作。且每个举证切片运算里面只能包含一个该运算符,否则发生错误

>>> arr[1:2,...,:,...,1:3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: an index can only have a single ellipsis ('...')

举例说明:

# arr是一个含有24个元素,维度为 2*1*3*4 的矩阵
>>> arr =np.arange(24).reshape(2,1,3,4)
>>> arr
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]]]]
)

# 在第一个维度,取1-3,因为只有第一维度只有两个元素(index为01),所以这里只得到(1*1*3*4)的矩阵
>>> arr[1:3]
array([[[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]]]
)


# 表示将最后一维度 取1-3 元素,其他不变
>>> arr[...,1:3]
array([[[[ 1, 2],
[ 5, 6],
[ 9, 10]]],


[[[13, 14],
[17, 18],
[21, 22]]]]
)

# 对第一个维度和最后一个维度进行操作
>>> arr[1:2,...,1:3]
array([[[[13, 14],
[17, 18],
[21, 22]]]]
)

2 [::-1]

这是运算符是对该维度取转置。

>>> arr =np.arange(24).reshape(2,1,3,4)
>>> arr
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]]]]
)
# 对第一个维度,取转置
>>> arr[::-1]
array([[[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]],


[[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]]]
)

#
>>> arr[::-1,:,:,::-1]
array([[[[15, 14, 13, 12],
[19, 18, 17, 16],
[23, 22, 21, 20]]],


[[[ 3, 2, 1, 0],
[ 7, 6, 5, 4],
[11, 10, 9, 8]]]]
)

所以,刚开始所看到的W = W[...,::-1,::-1]是对举证最后两个维度,进行转置

>>> arr[...,::-1,::-1]
array([[[[11, 10, 9, 8],
[ 7, 6, 5, 4],
[ 3, 2, 1, 0]]],


[[[23, 22, 21, 20],
[19, 18, 17, 16],
[15, 14, 13, 12]]]]
)