|
204 | 204 | print(b2) |
205 | 205 | print(a2) |
206 | 206 | print(arr2) |
| 207 | + |
| 208 | +# 线性代数模块(linalg) |
| 209 | +# 求范数 |
| 210 | +a=np.array([5,12]) |
| 211 | +print(a) |
| 212 | +b=np.linalg.norm(a) # norm表示范数,默认求2范数,ord=1求1范数,ord=np.inf求无穷范数 |
| 213 | +print(b) |
| 214 | + |
| 215 | +# 求矩阵的迹、行列式、秩、特征值、特征向量 |
| 216 | +b = np.array([ |
| 217 | + [1, 2, 3], |
| 218 | + [4, 5, 6], |
| 219 | + [7, 8, 9] |
| 220 | +]) |
| 221 | + |
| 222 | +print(np.trace(b)) # 15,求矩阵的迹(主对角线上各个元素的总和) |
| 223 | + |
| 224 | +c=np.linalg.det(b) |
| 225 | +print(c) # 输出一个很小的值6.66133814775e-16,求矩阵的行列式值 |
| 226 | + # 如果希望输出为0,使用round(c, 2),四舍五入保留小数点后两位 |
| 227 | + # 不过对精度要求高可以使用decimal模块 |
| 228 | + |
| 229 | +c=np.linalg.matrix_rank(b) |
| 230 | +print(c) # 2,求矩阵的秩 |
| 231 | + |
| 232 | +u,v=np.linalg.eig(b) # u为特征值 |
| 233 | +print(u) |
| 234 | +print(v) |
| 235 | + |
| 236 | +# 矩阵分解 |
| 237 | +# Cholesky分解并重建 |
| 238 | +d = np.array([ |
| 239 | + [2, 1], |
| 240 | + [1, 2] |
| 241 | +]) |
| 242 | + |
| 243 | +l = np.linalg.cholesky(d) |
| 244 | +print(l) # 得到下三角矩阵 |
| 245 | +e=np.dot(l, l.T) |
| 246 | +print(e) # 重建得到矩阵d |
| 247 | + |
| 248 | + |
| 249 | +# 对不正定矩阵,进行SVD分解并重建 |
| 250 | +U, s, V = np.linalg.svd(d) |
| 251 | + |
| 252 | +S = np.array([ |
| 253 | + [s[0], 0], |
| 254 | + [0, s[1]] |
| 255 | +]) |
| 256 | + |
| 257 | +print(np.dot(U, np.dot(S, V))) # 重建得到矩阵d |
| 258 | + |
| 259 | +# 矩阵乘法 |
| 260 | +# https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html#numpy.dot |
| 261 | +print(np.dot(3, 4)) # 12,0-D矩阵相乘(也就是标量相乘) |
| 262 | + |
| 263 | +print(np.dot([2j, 3j], [2j, 3j])) # (-13+0j),1-D矩阵相乘(实际上是向量做点积) |
| 264 | + |
| 265 | +a=[[1, 0], [0, 1]] |
| 266 | +b=[[4, 1, 0], [2, 2, 0]] |
| 267 | +print(np.dot(a, b)) |
| 268 | +''' |
| 269 | +array([[4, 1], |
| 270 | + [2, 2]]) |
| 271 | +2-D矩阵相乘 |
| 272 | +这里是2*2矩阵和2*3矩阵相乘,结果为2*3矩阵 |
| 273 | +''' |
| 274 | + |
| 275 | +a=[[1, 0], [1, 2]] |
| 276 | +b=[2,2] |
| 277 | +c=np.dot(a,b) |
| 278 | +print(c) |
| 279 | +''' |
| 280 | +[2 6] |
| 281 | +注意这里b是向量 |
| 282 | +numpy处理时并不是按照矩阵乘法规则计算 |
| 283 | +而是向量点积 |
| 284 | +也就是np.dot([1, 0],[1, 2])和np.dot([1, 2],[2,2]) |
| 285 | +''' |
| 286 | + |
| 287 | +# 再做个实验来区别向量乘法和矩阵乘法 |
| 288 | +b=np.array([ |
| 289 | + [1, 2, 3], |
| 290 | + [4, 5, 6], |
| 291 | + [7, 8, 9] |
| 292 | +]) |
| 293 | + |
| 294 | +# 这里插播一下,np.array([1,0,1])是3维向量,而不是1*3的矩阵 |
| 295 | +c1=np.array([[1,0,2]]) |
| 296 | +print(c1.shape) # (1, 3),这是一个1*3的矩阵 |
| 297 | +c2=np.array([1,0,2]) |
| 298 | +print(c2.shape) # (3,),这是一个3维向量 |
| 299 | + |
| 300 | +# print(np.dot(b,c1)) # 报错,不符合矩阵乘法规则 |
| 301 | +print(np.dot(b,c2)) # [ 7 16 25],点积运算 |
| 302 | + |
| 303 | +print(np.dot(c1,b)) # [[15 18 21]],矩阵乘法运算规则 |
| 304 | +print(np.dot(c2,b)) # [15 18 21],点积运算 |
| 305 | + |
| 306 | +# 还要补充一下,如果是用python自带的*运算符计算则是广播机制 |
| 307 | +print(b*c1) # print(b*c2)结果一样 |
| 308 | +''' |
| 309 | +[[ 1 0 6] |
| 310 | + [ 4 0 12] |
| 311 | + [ 7 0 18]] |
| 312 | +''' |
| 313 | +print(b+c1) # print(b*c2)结果一样 |
| 314 | +''' |
| 315 | +[[ 2 2 5] |
| 316 | + [ 5 5 8] |
| 317 | + [ 8 8 11]] |
| 318 | +''' |
0 commit comments