矩阵切片(快捷操作)
最近在看代码过程中看到如下表达式(其中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为0,1),所以这里只得到(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]]]])
Python函数参数默认值陷阱
函数默认值陷阱如下图所示:
具体原因参考:
深入讲解Python函数中参数的使用及默认参数的陷阱__脚本之家
Python函数参数默认值的陷阱和原理深究__伯乐在线
避免陷阱:
1、使用不可变量作为默认参数
python的数据类型分为mutable(可变) 和 immutable (不可变)
mutable : list ,dict
inmutable : int , string , float ,tuple…
2、更改函数内部代码,增加判断是否为默认参数
def generate_new_list_with(my_list=None, element=None):
# 这里如果使用默认参数,则重新将此参数初始化为空
if my_list is None:
my_list = []
my_list.append(element)
return my_list