Python相关细节问题(持续更新)

矩阵切片(快捷操作)

最近在看代码过程中看到如下表达式(其中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]]]])

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

猜你喜欢

转载自blog.csdn.net/sinat_34022298/article/details/79232895