练习题:
Ex1:利用列表推导式写矩阵乘法
一般的矩阵乘法根据公式,可以由三重循环写出:
In [138]: M1 = np.random.rand(2,3)
In [139]: M2 = np.random.rand(3,4)
In [140]: res = np.empty((M1.shape[0],M2.shape[1]))
In [141]: 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
.....:
In [142]: ((M1@M2 - res) < 1e-15).all() # 排除数值误差
Out[142]: True
请将其改写为列表推导式的形式。
作答:
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])]
纠错总结:
i和j的条件不能颠倒顺序,颠倒顺序之后会使得需要做乘法的矩阵不匹配,建议下次按照循环顺序,依次一层一层的添加条件
res = [[sum([M1[i][k] * M2[k][j] for k in range(M1.shape[1])]) for i in range(M1.shape[0])] for j in range(M2.shape[1])]
Ex2:更新矩阵
解题思路一:
A = np.arange(1,10).reshape(3,-1)
Asum= 1/A@np.ones(3) #计算出A矩阵三行的倒数之和
B=[[A[i][k]*Asum[i] for k in range(3)] for i in range(3)]
B
解题思路二:
A = np.arange(1,10).reshape(3,-1)
B = A*(1/A).sum(1).reshape(-1,1)
B
运行结果: