本文为组队学习pandas的学习记录,notebook在ubuntu上运行,博客在笔记本上完成。
三、练习
Ex1:利用列表推导式写矩阵乘法
一般的矩阵乘法根据公式,可以由三重循环写出,请将其改写为列表推导式的形式。
M1 = np.random.rand(2,3)
M2 = np.random.rand(3,4)
res = np.empty((M1.shape[0],M2.shape[1]))
for i in range(M1.shape[0]):
for j in range(M2.shape[1]):
item = 0
for k in range(M1.shape[1]):
item += M1[i][k] * M2[k][j]
res[i][j] = item
(np.abs((M1@M2 - res) < 1e-15)).all() # 排除数值误差
# my answer
res = [[sum([M1[i][k] * M2[k][j] for k in range(M1.shape[1])]) for j in range(M2.shape[1])] for i in range(M1.shape[0])]
res
(np.abs( (M1@M2 - res) < 1e-15)).all()
# 输出为true
第一次尝试写这么复杂的列表解析式,真是开了眼了!
代码是别人写出来的,我只能多写点记录一下理解过程。第一个for得到的数据作为一个list–新矩阵的第一行、第二行、第 i 行;
确定了i–M1矩阵的 i 行,接着遍历M2矩阵的 j 列----此为第二个for;
确定了M1的行、M2的列,接着逐元素相乘,相乘得到的多个数值直接求和----新矩阵的 r e s i j res_{ij} resij 元素。
Ex2:更新矩阵
设矩阵 A m × n A_{m×n} Am×n ,现在对 A A A 中的每一个元素进行更新生成矩阵 B B B ,更新方法是 B i j = A i j ∑ k = 1 n 1 A i k B_{ij}=A_{ij}\sum_{k=1}^n\frac{1}{A_{ik}} Bij=Aij∑k=1nAik1 ,例如下面的矩阵为 A A A ,则 B 2 , 2 = 5 × ( 1 4 + 1 5 + 1 6 ) = 37 12 B_{2,2}=5\times(\frac{1}{4}+\frac{1}{5}+\frac{1}{6})=\frac{37}{12}