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:
不使用if
,可使用bool
值构成的一个mask:
def huber_loss(res, delta):
return (abs(res)<delta)*delta**2/2 + (abs(res)>=delta)*(abs(res)-delta/2)
矩阵特殊位置的索引
如果多维数组
- 索引最后一行最后一列位置上的元素,
X[−1,−1] - 索引最后一列,
X[:,−1] - 索引最后一行,
X[−1,:] - 索引前
(m−1,n−1) ,X[:−1,:−1]
已知仿射变换(Affine transformation)执行的动作是:
对上述仿射变换做如下改造(转换成齐次坐标形式):
# 已知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),方法是使用矩阵乘法运算。也即:
>>> 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):取不到右端点,间距容易确定时使用。