python实用技巧(二)

时间:2020-12-06 16:04:13

Python实用技巧(一)
python实用技巧(二)
python实用技巧(三)
python实用技巧(四)

code 解释 补充
list.reverse() 返回值类型为NoneType l.reverse()实现自我翻转
x=l.reverse()是没有意义的
[1, 2, 3]*2 [1, 2, 3]*2==[1, 2, 3, 1, 2, 3]
[1, 2, 3] != [1, 2, 3, 3, 2, 1]

不使用if判断实现分段函数

Huber Loss function:
Lδ(y,f(x))=12(yf(x))2,δ(|yf(x)|12δ),for |yf(x)|δotherwise.

不使用if,可使用bool值构成的一个mask:

def huber_loss(res, delta):
return (abs(res)<delta)*delta**2/2 + (abs(res)>=delta)*(abs(res)-delta/2)

矩阵特殊位置的索引

如果多维数组 X 的shape为 (m,n)

  1. 索引最后一行最后一列位置上的元素, X[1,1]
  2. 索引最后一列, X[:,1]
  3. 索引最后一行, X[1,:]
  4. 索引前 (m1,n1) X[:1,:1]

已知仿射变换(Affine transformation)执行的动作是:
y⃗ =Ax⃗ +b⃗ 
对上述仿射变换做如下改造(转换成齐次坐标形式):
[y⃗ 1]=[A0,,0b⃗ 1][x⃗ 1]

# 已知A_{m*n}, b_{m*1}, x_{n*1},如何较为方便的构造齐次形式
A_homo = np.zeros((m+1, n+1))
A_homo[-1, -1] = 1
A_homo[:-1, :-1] = A
A_home[:—1, -1] = b

行向量在列方向上拷贝,列向量在行方向上拷贝

说的有点绕,也即行向量复制多行组成一个行与行均相等的矩阵(秩为1),列向量复制多列组成一个列与列均相等的矩阵(秩为1),方法是使用矩阵乘法运算。也即:
11m×1xT1×n=()m×n
xm×1[1,1,,1]1×n=()m×n

>>> x = np.random.rand(5)
# 一维数组
>>> x
array([ 0.26147322, 0.88062102, 0.87397723, 0.6219233 ])

# 行拷贝
>>> np.dot(np.ones((3, 1)), x.reshape((1, -1)))
array([[ 0.26147322, 0.88062102, 0.87397723, 0.6219233 ],
[ 0.26147322, 0.88062102, 0.87397723, 0.6219233 ],
[ 0.26147322, 0.88062102, 0.87397723, 0.6219233 ]]
)

# 列拷贝
>>> np.dot(x.reshape((-1, 1)), np.ones((1, 3)))
array([[ 0.26147322, 0.26147322, 0.26147322],
[ 0.88062102, 0.88062102, 0.88062102],
[ 0.87397723, 0.87397723, 0.87397723],
[ 0.6219233 , 0.6219233 , 0.6219233 ]]
)

简单的循环改造成list comprehension

X = []
for i in range(N):
X.append(...)

改造成:

X = [ ... for i in range(N)]

例如:

import scipy.stats as st
n, p = 100, .5
X = st.binom(n, p)
X_bar = [X.rvs(i+1).mean() for i in range(10000)]

[]*2:实现一种自动拷贝拓展

>>> [1, 2, 3]*2
[1, 2, 3, 1, 2, 3]

np.linspace(a, b, n) vs np.arange(a, b, step)

np.linspace(a, b, n):取得到右端点(b),点的个数容易确定时使用;
np.arange(a, b, step):取不到右端点,间距容易确定时使用。